1

Тема: Сішка, непередбачувана поведінка

Допоможіть роздуплитись з C.

Прихований текст

Якась сішка важка і низькорівнева. Тут навіть нереально отримати тип даних змінної


Отож треба ввести з клави int. Але треба перевіряти якщо юзер ввів не ціле число - то капець: треба показати ще раз ввід.

#include <stdio.h>

int main() {
    int height;
    int is_input_ok;
    do {
        printf("height: ");
        is_input_ok = scanf("%d", &height);
    } while (is_input_ok == 0);

    printf("after while");

}

Отаке є. Зчитуєм, десь нагуглив що scanf повертає 1 або 0, якщо ввід був ок. Компілиться, але: якщо ввести букви якісь: то просто зациклюється і прінтить на екран ("height: "). І не запитує ввід. Ну що за хрінь?

Подякували: Betterthanyou1

2

Re: Сішка, непередбачувана поведінка

scanf повертає кількість розпізнаних змінних. Оскільки ваша маска містить лише одну змінну - то 0 або 1.
А проблема ваша в тому, що scanf не читає з вхідного потоку символи, які йому не підійшли. Тобто якщо ви ввели "a", а очікується число, scanf одразу припиняє читати, а в буфері все ще лежить "a". Вам треба чистити буфер введення, якщо там щось, що вам не потрібно, а ще краще - читати з буфера рядок (fgets-ом, наприклад) і розбирати його окремо від вводу-виводу.

Подякували: FakiNyan, Q-bart, leofun013

3 Востаннє редагувалося Q-bart (20.09.2017 11:47:36)

Re: Сішка, непередбачувана поведінка

Ще б була можливість очистити той буфер.

        fflush(stdin);

- нічого не робить

4

Re: Сішка, непередбачувана поведінка

З fgets теж проблема, як читати від початку і до кінця?

    do {
        char height_str[3];
        printf("height: ");
        fgets(height_str, 4, stdin);

        height = strtol(height_str, &ptr, 10);
    } while ( height <= 0 || height > 23);

Бо якщо отак, то забере 3 елементи, а якщо елементів було введено більше - то просто перекине на наступний ввід

5

Re: Сішка, непередбачувана поведінка

fflush(stdin) не має визначеної документацією поведінки, на відміну від fflush(stdout).
А що вам заважає взяти більшу довжину рядка? 20 символів вистачить для будь-якого цілого (от тільки не треба брехати fgets, що в буфері 4 символи, якщо їх там 3).

Подякували: 0x9111A, LoganRoss, Q-bart, leofun014

6

Re: Сішка, непередбачувана поведінка

fflush(stdin) не має визначеної документацією поведінки,

Це тобто означає, ніби функція є, але що вона робить не відомо ?)

А що вам заважає взяти більшу довжину рядка? 20 символів вистачить для будь-якого цілого (от тільки не треба брехати fgets, що в буфері 4 символи, якщо їх там 3).

А якщо юзер введе 25 символів - знову станеться каша: перекине символи, що залишились (5) на наступний ввід.

Як зчитати всі-всі символи?

7

Re: Сішка, непередбачувана поведінка

Це нас просто вчать в універі по CS50. А вони ці круті "перці" написали свою бібліотеку: https://github.com/cs50/libcs50/ і пропонують студентам використовувати їхню функцію GetInt: https://github.com/cs50/libcs50/blob/80 … s50.c#L500

Це, як на мене, взагалі дічь: ось студенти ми вам спростили життя: для навчання написали бібліотеку, там вам ввід-вивід (і ще щось) реалізовано вже нормально, але я самому таке зробити і як бути в реальному житті - мовчок

8

Re: Сішка, непередбачувана поведінка

Це означає, що стандарт не визначає, як функції працювати конкретно із цим параметром, різні компілятори обробляють її по-різному. Натомість fflush(stdout) добре визначено.
А ви самі не можете відповісти на питання, як прочитати повністю рядок? Ну то давайте розбиратися:
- спробувати прочитати певний об'єм у буфер;
- якщо зустріли '\n' - все, повертаємо цей буфер;
- якщо не зустріли і буфер скінчився - збільшуємо буфер (тобто виділяємо більше пам'яті і копіюємо вже прочитані символи туди) і знову спочатку.
Який саме пункт викликає питання?

Подякували: Q-bart, leofun012

9

Re: Сішка, непередбачувана поведінка

Це означає, що стандарт не визначає, як функції працювати конкретно із цим параметром, різні компілятори обробляють її по-різному.

А питання не по темі: хто розробляє C зараз? Є стандарт, який написав розробник мови (в 1972 здається), і зараз кожен кому не лень - пише свій компілятор?

Нема так як в пітоні - Гвідо Ван Россум, який рішає куди все рухається?

10

Re: Сішка, непередбачувана поведінка

Останній стандарт - C11 (ISO/IEC 9899:2011). Але і там є такі поняття, як "поведінка, визначена компілятором" і "невизначена поведінка", це одна з фішок C - більша свобода для розробників компіляторів.

Подякували: Betterthanyou, Q-bart2

11

Re: Сішка, непередбачувана поведінка

Нашвидкуруч

#include <stdio.h>
#include <string.h>

int main()
{
    const int SIZE = 100;
    char input[SIZE] = "";
    char again = 'y';
    int num;
    unsigned int index;
    bool isInt = false;

    printf("Please, input an integer value, sir.\n");

    do
    {
        printf("> ");
        index = 0;
        fseek(stdin, 0, SEEK_END);
        while ((num = getchar()) != '\n' && num != EOF)
        {
            input[index] = num;
            ++index;
        }
        if (index == 0)
        {
            printf("Empty string. Just input it, you matherfucker!\n");
            continue;
        }
        for (unsigned int i = 0; i < index; ++i)
        {
            if (!iswdigit(input[i]))
            {
                isInt = false;
                break;
            }
            else
                isInt = true;
        }
        if (isInt)
        {
            printf("Good. You made it finally. More inputting? [y/n] ");
            fseek(stdin, 0, SEEK_END);
            again = getchar();
        }
        else
            printf("Not an integer value, foolish human. Try again.\n");
    } while (again == 'y');
    return 0;
}
Подякували: Betterthanyou1

12 Востаннє редагувалося Betterthanyou (21.09.2017 00:58:05)

Re: Сішка, непередбачувана поведінка

Q-bart написав:

але я самому таке зробити і як бути в реальному житті - мовчок

Чого мовчки ? Код досить зрозуміло прокоментований, а що роблять функції (та ін.) можна пошукати в інтернеті. Я вирізав тільки той код що відповідає за отримання цілочисельного значення.

/**
* Our own data type for string variables.
*/
typedef char *string;
#include <stdarg.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>

/**
* Number of strings allocated by get_string.
*/
static size_t allocations = 0;

/**
* Array of strings allocated by get_string.
*/
static string *strings = NULL;

/**
* Prompts user for a line of text from standard input and returns
* it as a string (char *), sans trailing line ending. Supports
* CR (\r), LF (\n), and CRLF (\r\n) as line endings. If user
* inputs only a line ending, returns "", not NULL. Returns NULL
* upon error or no input whatsoever (i.e., just EOF). Stores string
* on heap, but library's destructor frees memory on program's exit.
*/
string get_string(va_list *args, const string format, ...)
{

    // check whether we have room for another string
    if (allocations * sizeof(string) == SIZE_MAX)
    {
        return NULL;
    }

    // growable buffer for characters
    string buffer = NULL;

    // capacity of buffer
    size_t capacity = 0;

    // number of characters actually in buffer
    size_t size = 0;

    // character read or EOF
    int c;

    // prompt user
    if (format != NULL)
    {
        // initialize variadic argument list
        va_list ap;

        /** Student code will pass in printf-like arguments as variadic
        *  parameters. The student-facing get_string macro always sets args to
        *  NULL. In this case, we initialize the list of variadic parameters
        *  the standard way with va_start.
        */
        if (args == NULL)
        {
            va_start(ap, format);
        }
        /** When functions in this library call get_string they will have
        *  already stored their variadic parameters in a `va_list` and so they
        *  just pass that in by pointer.
        */
        else
        {
            // put a copy of argument list in ap so it is not consumed by vprintf
            va_copy(ap, *args);
        }
        // print prompt
        vprintf(format, ap);
        // cleanup argument list
        va_end(ap);
    }

    // iteratively get characters from standard input, checking for CR (Mac OS), LF (Linux), and CRLF (Windows)
    while ((c = fgetc(stdin)) != '\r' && c != '\n' && c != EOF)
    {
        // grow buffer if necessary
        if (size + 1 > capacity)
        {
            // initialize capacity to 16 (as reasonable for most inputs) and double thereafter
            if (capacity == 0)
            {
                capacity = 16;
            }
            else if (capacity <= (SIZE_MAX / 2))
            {
                capacity *= 2;
            }
            else if (capacity < SIZE_MAX)
            {
                capacity = SIZE_MAX;
            }
            else
            {
                free(buffer);
                return NULL;
            }

            // extend buffer's capacity
            string temp = (string)realloc(buffer, capacity);
            if (temp == NULL)
            {
                free(buffer);
                return NULL;
            }
            buffer = temp;
        }

        // append current character to buffer
        buffer[size++] = c;
    }

    // check whether user provided no input
    if (size == 0 && c == EOF)
    {
        return NULL;
    }

    // check whether user provided too much input (leaving no room for trailing NUL)
    if (size == SIZE_MAX)
    {
        free(buffer);
        return NULL;
    }

    // if last character read was CR, try to read LF as well
    if (c == '\r' && (c = fgetc(stdin)) != '\n')
    {
        // return NULL if character can't be pushed back onto standard input
        if (c != EOF && ungetc(c, stdin) == EOF)
        {
            free(buffer);
            return NULL;
        }
    }

    // minimize buffer
    string s = (string)realloc(buffer, size + 1);
    if (s == NULL)
    {
        free(buffer);
        return NULL;
    }

    // terminate string
    s[size] = '\0';

    // resize array so as to append string
    string *tmp = (string*)realloc(strings, sizeof(string) * (allocations + 1));
    if (tmp == NULL)
    {
        free(s);
        return NULL;
    }
    strings = tmp;

    // append string to array
    strings[allocations] = s;
    allocations++;

    // return string
    return s;
}

/***********************************************************************************************************************/

/**
* Prompts user for a line of text from standard input and returns the
* equivalent int; if text does not represent an int in [-2^31, 2^31 - 1)
* or would cause underflow or overflow, user is prompted to retry. If line
* can't be read, returns INT_MAX.
*/
int get_int(const string format, ...)
{
    va_list ap;
    va_start(ap, format);
    // try to get an int from user
    while (true)
    {
        // get line of text, returning INT_MAX on failure
        string line = get_string(&ap, format);
        if (line == NULL)
        {
            va_end(ap);
            return INT_MAX;
        }

        // return an int if only an int (in range) was provided
        if (strlen(line) > 0 && !isspace((unsigned char)line[0]))
        {
            char *tail;
            errno = 0;
            long n = strtol(line, &tail, 10);
            if (errno == 0 && *tail == '\0' && n >= INT_MIN && n < INT_MAX)
            {
                va_end(ap);
                return n;
            }
        }

        // temporarily here for backwards compatibility
        if (format == NULL)
        {
            printf("Retry: ");
        }
    }
}
int GetInt(void)
{
    return get_int(NULL);
}

int main()
{
    int height;

    height = GetInt();

    printf("number(int) = %i, after while", height);

    //pause
    getchar();
    return 0;
}

Я підозрюю що ви можете не знати що це

int get_int(const string format, ...)

таке. Подивіться тут http://www.cplusplus.com/reference/cstdarg/

Код має багато перевірок (та іт.) які зроблені "на всякий випадок", тому потрібно звернути увагу на таке
Рядки 83 - 119 - тут йде збільшення буферу (тобто рядок можна вводити "будь якої довжини")
Рядки 201-202 - перевірки чи це інт
Якщо все пройшло успішно то strtol повертає long int число, якщо ні то в tail записується наступні символи після числа (якого немає), тобто якщо було введено "qjd" то функція "запише" в tail рядок "qjd", перевіривши рядок на пустоту (*tail == '\0') можна зробити висновок, якщо рядок пустий - функція виконана успішно, якщо рядок не пустий - функція "не виконана успішно"

Подякували: LoganRoss, Q-bart, leofun013

13

Re: Сішка, непередбачувана поведінка

От зараз точно не відкрутититесь, що це в стандарті так написано  :)

Код:

#include "stdio.h"

int main(int argc, char const *argv[])
{
    float first_a = 6.5;
    float second_a = 4.8;
    float error_a = 4.2;

    printf("%f\n", first_a * 100.0);
    printf("%f\n", second_a * 100.0);
    printf("%f\n", error_a * 100.0);

    return 0;
}

Результат:

650.000000
480.000019
419.999981

Ну це нормально? *WALL*  *FACEPALM*

14

Re: Сішка, непередбачувана поведінка

Q-bart написав:

От зараз точно не відкрутититесь, що це в стандарті так написано  :)

...

Ну це нормально? *WALL*  *FACEPALM*

Стандарт IEEE 754-2008 каже, що так.

Подякували: Q-bart, leofun012

15

Re: Сішка, непередбачувана поведінка

ну да кажуть, що треба юзати double. А чого?

---
Хоча про що, це я. Там точно проблема в розмірі десь, тільки б знати яка різниця

16

Re: Сішка, непередбачувана поведінка

Американці через такі фокуси, до речі, під час "Бурі в пустелі" Patriotом в Skud (який Ельбрус) не влучили і втратили 28 загиблими і більше 100 пораненими.

Подякували: Q-bart, Betterthanyou, leofun013

17

Re: Сішка, непередбачувана поведінка

Як це пояснювати можна? Або гуглити, бо щось нічого толкового не знайшов))

18

Re: Сішка, непередбачувана поведінка

А про "Бурю в пустелі". Нічого не знайшов такого, щоб детальніше, ні укр. ні англ..

Тільки ось: http://fuck-hack.com/burya-v-pusteli-2- … wars-2002/ - щоб посміятись


Прихований текст

Буря в пустелі-2, або WinWars 2002

Компанія «Microsoft» підписала контракт з американськими військовими на розробку програмного забезпечення для нових видів озброєнь.

01.04.2002, 4:30. Саудівська Аравія. База ВПС США.

Лейтенант Джон Фолкон в останній раз махнув рукою товаришам і поліз у кабіну. Його переповнювало почуття гордості. Ще б пак, йому довірена така честь! Він дізнався про це від генерала Брейку, який сказав: «Вам довірена велика честь, лейтенант. Ви зробите перший бойовий виліт на новітньому надсекретний літаку F-22M.» “‘M’ означає ‘модифікований’?” — уточнив Фолкон. “‘M’ означає ‘Microsoft’, — відповів генерал. -Літак повністю переобладнаний цими хлопцями. Вони запевняють, що тепер бойові завдання зможе виконувати будь-ідіот. Але ми для першого разу обрали вас, як одного з кращих наших пілотів. Ви повинні будете знищити іракський ядерний центр.” «Можете слати співчуття Саддаму вже зараз, сер, — відповів Фолкон.
Лейтенант звично заклацнув ремені і лише тут звернув увагу, що приладова панель помітно відрізняється від стандартної. Приладів стало менше, зате на звільненому місці спочивала двухкнопочная миша, чомусь металева. Фолкон знизав плечима і включив загальне харчування.
На прозорому лобовому екрані, на тлі який відкривався з кабіни неба з рідкими хмарами, виникла напис: Microsoft Winwars 2002. Потім самі собою запрацювали двигуни, і опустилися у злітне положення закрилки. «Вітаємо вас із придбанням Winwars 2002! — повідомив екран. -Тепер війна стане набагато більш зручною, ваша убиваемость знизиться, а ураженість цілей зросте! Порада дня: перед посадкою випускайте шасі.»

-Орел-1, зліт дозволено, — пролунало в шлемофоні.
-Я ще не запитував, — здивувався Фолкон.
-А вам і не потрібно. Plug’n’play, — пояснив наземний контроль.

Літак, стрімко набираючи швидкість, помчав по смузі і незабаром був уже в повітрі. «Зараз Winwars 2002 справить інсталяцію вашого боєзапасу на обрану мету, — повідомила система. -Обрана мета: іракський ядерний центр». Фолкон заради інтересу клікнув по кнопці «змінити» і побачив довгий список, в якому серед інших об’єктів по всьому світу фігурували Білий будинок та база, скоторой він тільки що вилетів. Фолкон поспішно натиснув «скасувати».

Виберіть тип інсталяції:
Мінімальний — на об’єкт будуть скинуті тільки бомби
Нормальний — на об’єкт будуть скинуті бомби і ракети
Повний — на об’єкт буде скинутий літак повністю»

За замовчуванням система пропонувала другий варіант, і Фолкон, боязко покосившись на третій, вирішив з нею не сперечатися.

«Зараз буде проведено тестування продуктивності вашої машини. Закрийте очі, щоб уникнути пошкоджень при зміні режимів».

Заревіли на форсажі двигуни, і очі Фолкона дійсно ледь не вискочили з орбіт від жахливої перевантаження. Почалося справжнє пекло: літак кидало на всі боки, він зривався в круті піку і закладав немислимі віражі… Нарешті лейтенант прийшов в себе; темрява перед очима розвіялася, і він побачив, як мотавшаяся по всій кабіні мишка знову впала на своє місце.

«Ви користуєтеся літаком Lockheed F-22 з двома двигунами Пратта-Вітні, — незворушно повідомила система. -Максимальна швидкість 1451 миля на годину. Порада дня: не підвищуйте тактову частоту турбіни вище значення, зазначеного виробником. Розрахунковий час інсталяції — 0:34:16.»

Того ж дня, 4:52. Небо над Іраком.

Внизу екрану повільно повзла синя смужка з відсотками. Система між тим рекламувала Winwars для танків, підводних човнів і морських піхотинців, а також обіцяла всім придбали версію для літаків безкоштовний аплет «Камікадзе 1.01». Зміна картинок по діяла на Фолкона усипляюче; з полудремотного стану його вивів звук зумера. На радарі світилася зелена крапка.

«Виявлено новий пристрій: літак противника!» — радісно
повідомила система. Фолкон хотів уже виконати стандартний бойовий розворот, але тут помітив кнопку «Видалити» і клікнув по ній мишкою.

«Ви впевнені, що хочете видалити літаків супротивника?» — підозріло запитала система.

«Ще б пак!» — Фолкон клікнув «Так». Іракський винищувач пропав з радарів. «Так швидко? — здивувався лейтенант. — Hy Microsoft дає!» Він навіть з повагою заходився вивчати з’явилася на екрані рекламу Winwars для пілотів-інвалідів, однак від цього заняття його від вабила ракета, пролетівша над самою кабіною. Фолкон здивовано обернувся і побачив іракський перехоплювач.

«Що ж ти, твою мать…» — вигукнув Фолкон і тільки тут побачив, що з непримітною іконки RecycleBin в кутку екрану стирчить нарисо-
ванний хвіст літака. Лейтенант люто клацнув по іконці і натиснув «Очистити».

«Ви впевнені, що хочете фізично видалити літаків супротивника? Його відновлення буде неможливо», -попередила система.

«ТАК!» — гаркнув Фолкон, долбя миша. З-під крила зірвався Sidewinder і, залишаючи білий пухнастий слід, помчав назустріч перехватчику. Блиснула спалах вибуху, і палаючі уламки ворожої машини полетіли до землі.

Однак заспокоюватися рано. Пиликающий звук попередив про нову небезпеку.

«Виявлено новий пристрій: ракета “земля-повітря’!» — повідала система і впала в задуму. Марно Фолкон бив по мишці, дивлячись, як зловісна точка повзе до центру радара. Нарешті система вийшла зі ступору:

«Не можу знайти драйвер для цього пристрою. Вставте диск з драйвером і натисніть ОК».

З лайкою Фолкон натиснув «Шукати».

«Найближчим відповідність: ручні гранати, — втішила його систе-
ма. -Застосувати?» Фолкон рвонув убік ручку, йдучи в протиракетний маневр. Занадто пізно. Літак здригнувся від вибуху. Насилу вивівши пошкоджену машину з піке, пілот клікнув по кнопці «Система». Під рядком «Ліве крило» світилися жетлыми трегольниками з знаками оклику «Елерон» і «Закрилок», але в іншому він дешево відбувся. Синя смужка, що продовжував повзти внизу, показувала вже 82%, і y нього все ще були шанси виконати завдання.

Радар показав ще два ворожі літаки, але вони піднялися ззаду
і Фолкона особливо не турбували. Він знав, що цієї іракської мотлоху просто не наздогнати надшвидкісний F-22.

Проте літаки наближалися. Фолкон з подивом глянув на спідометр і зрозумів, що його швидкість швидко падає. «Що за чорт?! — вигукнув лейтенант. — Двигуни ж порядку, що і палива повно!» Екран тим часом почав запекло помаргивать зображенням пісочного годинника. Стрілки приладів рухалися короткими ривками, подовгу застигаючи в одному положенні. «Недостатньо вільної пам’яті, — зійшла до пояснення система. -Вивантажите зайві завдання.»

Фолкон викликав список завдань, намагаючись зрозуміти, що означають назви типу winppl або v666apl і які з них зайві. Між тим двигуни майже замовкли, швидкість впала до критичної: ще трохи- і літак впаде вниз. Очманілі від такої тактики повітряного бою іракці просвистіли мимо, один ліворуч, інший праворуч, і, не виходячи зі ступору, зіткнулися перед носом Фолкона.

Лейтенант тим часом відшукав в списку рядок «Відстеження супротивника», поряд з якою в дужках значилося: “[Не відповідає]”, і натиснув ‘ОК’. Екран радара згасло, зате літак почав знову набирати швидкість.

Синя смужка показувала вже 99%… ось, нарешті, і 100. Фолкон з
подивом дивився на землю: пустеля внизу зовсім не була схожа на вивчені їм супутникові фотографії ядерного центру. Схоже, розуміла це і система, тому що слідом за числом 100% з’явилося 101… потім 102…

На 106 екран залила синява, і з’явився напис: «Помилка 000000e, викликана модулем VXD0000(0) з модуля VXD0000(0). Можливо нормальне продовження польоту. Ви можете натиснути Eject для катапультування, або будь-яку іншу клавішу. Увага: при катапультуванні ви втратите весь незбережений літак.»

Катапультуватися Фолкон поки що не збирався, тим більше що
попереду, нарешті, здався ядерний центр. Зрозумівши, що на Microsoft більше покладатися не варто, лейтенант приготувався про-
вести бомбометання вручну. Він повів літак на зниження, чекаючи, поки відмітка системи наведення накладеться на ціль. Є! Фолкон втиснув кнопку.

Щось проскрежетало, і вискочило нове повідомлення: «Бомболюк виконав неприпустиму операцію і буде закрита.» З прокляттям Фолкон потягнув ручку на себе, щоб знову направити машину вгору. Але літак продовжував швидко знижуватися. Лейтенант гарячково нишпорив мишкою по менюшки, шукаючи причину. «Джойстик не визначається», — прочитав він нарешті. Зрозумівши, що повернути систему в робочий стан може тільки перезапуск, Фолкон вимкнув і включив живлення пульта.

«Минулий політ був завершений некоректно, — повідомила йому система. -Натисніть будь-яку клавішу, щоб почати перевірку цілісності літака». «До біса!» — гаркнув Фолкон, натискаючи «Скасувати». З’явилася заставка Winwars 2002; система неспішно початку грузиться. До землі залишалися вже лічені сотні метрів.

«Система завантажена в безпечному режимі, — нарешті повідав екран.
-В цьому режимі відключені функції польоту і використання зброї, ви можете тільки їздити по аеродрому.»

Зрозумівши, що більше він вже нічого зробити не встигне, Фолкон долба-
ннл ‘Eject’, очікуючи, що зараз буде відстрелений ковпак кабіни, а потім могутній удар знизу викине його в повітря. Але замість цього
на екрані з’явився черговий питання:

«Ви впевнені, що хочете катапультуватися?»

«ТАК!!!» — нестямно заволав Фолкон, дивлячись на мчала назустріч
землю.

«Почекайте, триває підготовка до катапультированию», — незворушно поінформувала система і поринула в задуму…

2.04.2002, 13:20. Багдад. Палац Саддама Хусейна.

-Таким чином, — бадьоро доповідав генерал, — завдяки самовіддані і доброс-
верженным зусиллям наших льотчиків, які вступили в нерівну сутичку з американським агресором, вдалося відстояти безпеку ядерного центру, і був знищений новітній секретний літак противника…

-Так? — важкий погляд диктатора уперся в обличчя доповідача, і той поспішно опустив погляд. -Справді, нерівну. Троє проти одного, і їх щастя, що вони не вижили, оскільки він все одно долетів до центру. Якщо центр що і врятувало, то тільки милість Аллаха.

Генерал покрився холодним потом. Він розумів, що його тепер ніяка милість Аллаха не врятує.

-У тебе 30 секунд, щоб виправдатися, — ліниво кинув Саддам.

-Ось! — вигукнув генерал, виймаючи з опечатаного контейнера
блискучий компакт-диск. -Це знайшли серед уламків літака. Вершина американських комп’ютерних технологій! Новітні програми управління бойовою технікою!

-Hy що ж, y тебе з’явився маленький шанс, — диктатор відкинувся в кріслі. — За три тижні це має бути встановлено на всі бойові машини нашої армії.

-Буде виконано, пане президент! — вигукнув генерал…

Через три тижні і один день Ірак беззастережно капітулював.

19

Re: Сішка, непередбачувана поведінка

Будь ласка:
https://embeddedgurus.com/barr-code/201 … e-failure/

Подякували: Betterthanyou, Q-bart2

20

Re: Сішка, непередбачувана поведінка

Q-bart написав:

Як це пояснювати можна? Або гуглити, бо щось нічого толкового не знайшов))

Ось хороша стаття: Неочевидные особенности вещественных чисел, щоправда російською.

Подякували: Betterthanyou, Q-bart, leofun013