12°C
завтра: 5°C
Погода в Перми
12°C
вечером12°C
ночью4°C
завтра5°C
Подробно
 63,96
−0.1086
Курс USD ЦБ РФна 20 апреля
63,9602
−0.1086
 71,92
−0.3208
Курс EUR ЦБ РФна 20 апреля
71,9232
−0.3208
PRM.Форум /Компьютеры Интернет Связь / Программирование /

я пишу на с++ - через час я удавлюсь

  • Анонимный пользователь
    я скоро удавлюсь.... с++:
    есть переменная long gameTime; все шито-крыто, даже начальное значение присвоено.
    проверка
    if (gameTime % 1440 == 0) {...}
    кидает Division by zero, если gameTime на 1440 нацело не делится!!!
    ладно, попробуем по-другому:
    if (floor(gameTime/1440) == gameTime/1440) {...}
    (floor дает целую часть числа (снизу)) конечно не очень красиво, но зато выполняется всегда! даже если gameTime не делится на 1440. вставляю в тело условия код:
    printf("%lf, %lf\n", floor(gameTime/1440), gameTime/1440);
    видим, что floor(gameTime/1440) действительно дает целую часть от gameTime/1440 (в типе float), видим также, что просто gameTime/1440 дает всегда 0! ладно, меняем вывод - вместо второго %lf ставим %i , видим, что да, gameTime/1440 дает в типе int (или long) целую часть от gameTime/1440. Понимаем неочевидную ошибку, меняем условие:
    if(floor(gameTime/1440) == (float)gameTime/1440) {...} -
    снова получаем деление на ноль, когда gameTime на 1440 нацело не делится! пробуем по-другому:
    if( (long)floor(gameTime/1440) == (long)gameTime/1440) {...} -
    получаем, что условие выполняется всегда!!!
    АААААААААААААААА

    ЧТО ДЕЛАТЬ!!!

    ЗюЫю это не камень в сторону с++

  • Анонимный пользователь
    я не верю, что тот код, который ты привел, может такое делать.

    но вообще говоря, ==0 делать необязательно, можно сделать так:

    if( !(gameTime%1440) ) {...}

    т.к. 0 переводится в false, а не 0 - в true.

    а вообще, приведи код в исходном виде, потому что приведенный тобою выше код работает нормально, не так как ты описал.

  • Анонимный пользователь
    извиняюсь, все нормально, проблема не в том, позор мне, удаляюсь восвояси, короче тему можно удалять.

  • Анонимный пользователь
    вообще, бред какой-то...

    1. if (gameTime % 1440 == 0) {...}
    в данном виде, делитель всегда 1440, operator% выполняется раньше operator== - всё всегда должно работать.

    2. if (floor(gameTime/1440) == gameTime/1440) {...}
    gameTime/1440 по определению целая часть от gameTime/1440 в математическом смысле (целочисленное деление) и 0 будет только в случае gameTime

Записей на странице:

Перейти в форум

Модератор: