Проблема с дробными значениями -
PeM6o - 02.06.2012
Здравствуйте, товарищи. Жажду вашего совета, так как самому в голову ничего не приходит.
Суть:
Нужно от переменной отнимать дробное значение и потом выводить на экран это через "
TextDraw" обновляя через промежуток времени. Проблема в том, что если целое отнимать, то всё нормально, а если пытаюсь сделать задуманное(отнимать дробное), то при обновлении вот что происходит ...
То есть, вместо того, чтобы отнимать от 100%, в начале, как садишься в авто на долю секунды оно показывает 100%, а потом вдруг начинает вырастать в такое громадное число. Непонятно почему. Кусочек кода:
Код:
format(string, sizeof(string), "Fuel: %d%",Gas[vehicle]);
TextDrawSetString(FuelDraw[i],string);
TextDrawShowForPlayer(i, FuelDraw[i]);}
if(IsAPlane(vehicle) || IsABoat(vehicle) || IsABMX(vehicle))
{
Gas[vehicle]++;
}
Gas[vehicle] -= 0.05;
В формате менял тип с %d на %f(%.2f), но толку от этого 0. Буду благодарен на дельный совет.
Re: Проблема с дробными значениями -
ZiGGi - 02.06.2012
Массив Gas должен быть типа Float.
Выводить надо так:
pawn Код:
format(string, sizeof(string), "Fuel: %.0f%%",Gas[vehicle]);
Re: Проблема с дробными значениями -
PeM6o - 02.06.2012
Бинго! Благодарю.
Re: Проблема с дробными значениями -
iEnemY - 03.06.2012
О, насколько я помню, если
То получим огромное число.
А вот если
То всё окей. Я думаю в этом у Вас проблема (Gas[vehicle] -= 0.05;)
Re: Проблема с дробными значениями -
jhonyxakep - 03.06.2012
Quote:
О, насколько я помню, если
pawn Код:
new Float:f;
f += 10;
То получим огромное число.
А вот если
pawn Код:
new Float:f;
f = f + 10;
То всё окей. Я думаю в этом у Вас проблема (Gas[vehicle] -= 0.05
|
Еще одна причина обновить версию языка в SA:MP
Re: Проблема с дробными значениями -
-Stranger- - 03.06.2012
jhonyxakep, а разве такое может случиться?
Re: Проблема с дробными значениями -
jhonyxakep - 04.06.2012
Если все-все начнут долбить Куя толпой... То наверно.
Re: Проблема с дробными значениями -
eakwarp - 04.06.2012
Quote:
Originally Posted by iEnemY
О, насколько я помню, если
То получим огромное число.
А вот если
То всё окей. Я думаю в этом у Вас проблема (Gas[vehicle] -= 0.05;)
|
Лолчто? Совсем скурились?
<=>
Re: Проблема с дробными значениями -
ZiGGi - 04.06.2012
Quote:
Originally Posted by jhonyxakep
Если все-все начнут долбить Куя толпой... То наверно.
|
Нее, толпы крабиков заорут о том, что не могут переделать свои скрипты под новую версию

.
Re: Проблема с дробными значениями -
iEnemY - 04.06.2012
Quote:
Originally Posted by eakwarp
Лолчто? Совсем скурились?
|
Это Вам не помешало бы скурить чонить, и расслабицо
Раз я говорю что есть баг, значит он есть.
See example:
И таааак...?
Совсем уж обленились. Надо сначала проверить, прежде чем выпендривацо.
Re: Проблема с дробными значениями -
eakwarp - 04.06.2012
Вы - идиот. Сложение целого и дробного числа, естественно приведет к такому исходу. А то что вы говорите, далеко не значит, что так и есть.
Re: Проблема с дробными значениями -
iEnemY - 04.06.2012
Quote:
Originally Posted by eakwarp
Сложение целого и дробного числа, естественно приведет к такому исходу.
|
Нет. Сложение способом
+= привёдет. А
a = a + b - нет. Я это и пытался доказать, но тем временем Вы были уверены, что оба способа равносильны. Ну хоть под конец согласились.
Re: Проблема с дробными значениями -
jhonyxakep - 04.06.2012
Quote:
Вы - идиот. Сложение целого и дробного числа, естественно приведет к такому исходу. А то что вы говорите, далеко не значит, что так и есть.
|
Незнаю как у ас в павне это делается, но я согласен с iEnemY. Сложение дробного числа и целого должно обрабатывать только целую часть. Если уж написано что это c-like синтаксис, хотя-бы такие мелочи соблюдать могли.
Re: Проблема с дробными значениями -
Stepashka - 04.06.2012
Уважаемые, если в вашей системе установлена говенные библиотеки не надо гнать на разработчиков и язык!
pawn Код:
public OnGameModeInit()
{
new Float:a = 1.5;
a += 3;
printf("`1.5 += 3`: %f", a);
a = 1.5;
a += 3.0;
printf("`1.5 += 3.0`: %f", a);
a = 1.5;
a = a + 3;
printf("`1.5 + 3`: %f", a);
a = 1.5;
a = a + 3.0;
printf("`1.5 + 3.0`: %f", a);
}
Код:
[18:04:46] `1.5 += 3`: 4.500000
[18:04:46] `1.5 += 3.0`: 4.500000
[18:04:46] `1.5 + 3`: 4.500000
[18:04:46] `1.5 + 3.0`: 4.500000
Наустанавливают всяких говносборок, и библиотек ненужных, потом ругают всех и вся, и приложения запустить не могут.
Если у вас проблема, а у других её нет - проверьте крепление рук.
ЗЫ
iEnemY, пихать код в
main, хоть это к проблеме не относится,

Re: Проблема с дробными значениями -
jhonyxakep - 04.06.2012
Quote:
Наустанавливают всяких говносборок, и библиотек ненужных, потом ругают всех и вся, и приложения запустить не могут.
Если у вас проблема, а у других её нет - проверьте крепление рук.
|
всякие арифметические операции могут глючить по нескольким причинам:
Проблемы ОС или её устройство.
Процессор или то, как программа его использует
Память
Интерпретатор
Во всех случаях разработчик уж точно не виноват. Мало того все ДОЛЖНО работать везде и одинаково... Если конечно это истинная кроссплатформенность.
Quote:
Если у вас проблема, а у других её нет - проверьте крепление рук.
|
Надо уметь писать код с учетом всех библиотек и других особенностей. Если этого нет - ошибка разработчика, а не пользователя.
В данном случае пользователь - скриптер, разработчик... - разработчик.
Re: Проблема с дробными значениями -
iEnemY - 04.06.2012
Quote:
Originally Posted by Stepashka
pawn Код:
public OnGameModeInit() { new Float:a = 1.5; a += 3; printf("`1.5 += 3`: %f", a); a = 1.5; a += 3.0; printf("`1.5 += 3.0`: %f", a); a = 1.5; a = a + 3; printf("`1.5 + 3`: %f", a); a = 1.5; a = a + 3.0; printf("`1.5 + 3.0`: %f", a); }
Код:
[18:04:46] `1.5 += 3`: 4.500000
[18:04:46] `1.5 += 3.0`: 4.500000
[18:04:46] `1.5 + 3`: 4.500000
[18:04:46] `1.5 + 3.0`: 4.500000
Наустанавливают всяких говносборок, и библиотек ненужных, потом ругают всех и вся, и приложения запустить не могут.
Если у вас проблема, а у других её нет - проверьте крепление рук.
ЗЫ iEnemY, пихать код в main, хоть это к проблеме не относится,  
|
В main'e я просто тестирую, причём тут это? На результат никак не влияет.
А Вы заметили разницу в наших примерах?
Ваш:
pawn Код:
new Float:a = 1.5;
a += 3;
printf("`1.5 += 3`: %f", a);
Мой:
pawn Код:
new Float:a = 1.5, b = 4;
a += b;
printf("%f", a);
Если "флоат += переменная" - то получаем хрень. Если "флоат += число" - то всё окей. Это не есть нормально. Но так или иначе, "флоат = флоат + число\переменная" - всё окей.
Re: Проблема с дробными значениями -
Stepashka - 04.06.2012
Quote:
Originally Posted by iEnemY
Если "флоат += переменная" - то получаем хрень. Если "флоат += число" - то всё окей. Это не есть нормально. Но так или иначе, "флоат = флоат + число\переменная" - всё окей.
|
Как интересно, незначительное изменение, а какой интересный результат.
А если быть вообще политкорректным, используйте для работы с вещественными числами специально созданные для этого функции, для нашего случая эта:
floatadd
Работают всегда правильно и быстрее чем обычные операторы.
Re: Проблема с дробными значениями -
ZiGGi - 04.06.2012
В документации написано:
Only the following operators may be redefined: +, -, *, /, %, ++, --, ==, !=, <, >, <=, >=, ! and =.
+= и -= нет, значит их нельзя правильно подогнать под Float, даже в последней версии.
Почему работает +? Потому что там используется функция floatadd
float.inc
pawn Код:
stock Float:operator+(Float:oper1, oper2)
return floatadd(oper1, float(oper2));
А т.к. мы не можем редефайнить += и -=, значит они работают как с целыми числами.
pawn Код:
new a = 1,
Float:b = 4;
a += b;
printf("%d", a);
Вывод: 5
pawn Код:
new a = 1,
Float:b = 4;
a = a + b;
printf("%d", a);
Вывод: 1084227584 (и tag mismatch при компиляции, убрать: _:b)
А если выводить так
То вывод: 4 (наверное вызвался floatadd, т.к. есть Float значение и преобразовал a в Float

)
В общем полный каламбур и неразбериха, лучше использовать языки с нормальной типизацией...
Re: Проблема с дробными значениями -
ZiGGi - 04.06.2012
Бугога
pawn Код:
new Float:a = 1.5,
b = 4;
a += b;
printf("%f", a);
Выводит каламбур
pawn Код:
new Float:a = 1.5,
b = 4;
b += a;
printf("%f", b);
Выводит: 5.5
В доках написано:
The parser recognizes operators like “+=” as a sequence of “+” and “=” and it will call a user-defined operator “+” if available and/or a user-defined operator “=”. In the example program, the line “chksum = chksum + value” might have been abbreviated to “chksum += value”.
Т.е. парсер парсит код вида a += b в a = a + b, но, как я понял, он парсит его без указателя

и скорее-всего это исправлено в новой версии.
pawn Код:
new Float:a = 1.5,
b = 4;
a = _:a + b; // вот так парсер парсит:)
printf("%f", a);
Вывод: 1069547520.000000
Re: Проблема с дробными значениями -
jhonyxakep - 04.06.2012
Вот вот. Не все так гладко... И главное не все поддается разумному объяснению, мистика