Проблема с дробными значениями
#1

Здравствуйте, товарищи. Жажду вашего совета, так как самому в голову ничего не приходит.
Суть:
Нужно от переменной отнимать дробное значение и потом выводить на экран это через "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. Буду благодарен на дельный совет.
Reply
#2

Массив Gas должен быть типа Float.
Выводить надо так:
pawn Код:
format(string, sizeof(string), "Fuel: %.0f%%",Gas[vehicle]);
Reply
#3

Бинго! Благодарю.
Reply
#4

О, насколько я помню, если
pawn Код:
new Float:f;
f += 10;
То получим огромное число.

А вот если
pawn Код:
new Float:f;
f = f + 10;
То всё окей. Я думаю в этом у Вас проблема (Gas[vehicle] -= 0.05;)
Reply
#5

Quote:

О, насколько я помню, если
pawn Код:
new Float:f;
f += 10;
То получим огромное число.

А вот если
pawn Код:
new Float:f;
f = f + 10;
То всё окей. Я думаю в этом у Вас проблема (Gas[vehicle] -= 0.05
Еще одна причина обновить версию языка в SA:MP
Reply
#6

jhonyxakep, а разве такое может случиться?
Reply
#7

Если все-все начнут долбить Куя толпой... То наверно.
Reply
#8

Quote:
Originally Posted by iEnemY
Посмотреть сообщение
О, насколько я помню, если
pawn Код:
new Float:f;
f += 10;
То получим огромное число.

А вот если
pawn Код:
new Float:f;
f = f + 10;
То всё окей. Я думаю в этом у Вас проблема (Gas[vehicle] -= 0.05;)
Лолчто? Совсем скурились?

pawn Код:
new Float:f;
f += 10;
<=>
pawn Код:
new Float:f;
f = f + 10;
Reply
#9

Quote:
Originally Posted by jhonyxakep
Посмотреть сообщение
Если все-все начнут долбить Куя толпой... То наверно.
Нее, толпы крабиков заорут о том, что не могут переделать свои скрипты под новую версию.
Reply
#10

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Лолчто? Совсем скурились?
Это Вам не помешало бы скурить чонить, и расслабицо

Раз я говорю что есть баг, значит он есть.
See example:



И таааак...?

Совсем уж обленились. Надо сначала проверить, прежде чем выпендривацо.
Reply
#11

Вы - идиот. Сложение целого и дробного числа, естественно приведет к такому исходу. А то что вы говорите, далеко не значит, что так и есть.
Reply
#12

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Сложение целого и дробного числа, естественно приведет к такому исходу.
Нет. Сложение способом += привёдет. А a = a + b - нет. Я это и пытался доказать, но тем временем Вы были уверены, что оба способа равносильны. Ну хоть под конец согласились.
Reply
#13

Quote:

Вы - идиот. Сложение целого и дробного числа, естественно приведет к такому исходу. А то что вы говорите, далеко не значит, что так и есть.

Незнаю как у ас в павне это делается, но я согласен с iEnemY. Сложение дробного числа и целого должно обрабатывать только целую часть. Если уж написано что это c-like синтаксис, хотя-бы такие мелочи соблюдать могли.
Reply
#14

Уважаемые, если в вашей системе установлена говенные библиотеки не надо гнать на разработчиков и язык!
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, хоть это к проблеме не относится,
Reply
#15

Quote:

Наустанавливают всяких говносборок, и библиотек ненужных, потом ругают всех и вся, и приложения запустить не могут.
Если у вас проблема, а у других её нет - проверьте крепление рук.

всякие арифметические операции могут глючить по нескольким причинам:
Проблемы ОС или её устройство.
Процессор или то, как программа его использует
Память
Интерпретатор

Во всех случаях разработчик уж точно не виноват. Мало того все ДОЛЖНО работать везде и одинаково... Если конечно это истинная кроссплатформенность.

Quote:

Если у вас проблема, а у других её нет - проверьте крепление рук.

Надо уметь писать код с учетом всех библиотек и других особенностей. Если этого нет - ошибка разработчика, а не пользователя.

В данном случае пользователь - скриптер, разработчик... - разработчик.
Reply
#16

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);
Если "флоат += переменная" - то получаем хрень. Если "флоат += число" - то всё окей. Это не есть нормально. Но так или иначе, "флоат = флоат + число\переменная" - всё окей.
Reply
#17

Quote:
Originally Posted by iEnemY
Посмотреть сообщение
Если "флоат += переменная" - то получаем хрень. Если "флоат += число" - то всё окей. Это не есть нормально. Но так или иначе, "флоат = флоат + число\переменная" - всё окей.
Как интересно, незначительное изменение, а какой интересный результат.
А если быть вообще политкорректным, используйте для работы с вещественными числами специально созданные для этого функции, для нашего случая эта: floatadd
Работают всегда правильно и быстрее чем обычные операторы.
Reply
#18

В документации написано:
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)
А если выводить так
pawn Код:
printf("%f", a);
То вывод: 4 (наверное вызвался floatadd, т.к. есть Float значение и преобразовал a в Float )

В общем полный каламбур и неразбериха, лучше использовать языки с нормальной типизацией...
Reply
#19

Бугога
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
Reply
#20

Вот вот. Не все так гладко... И главное не все поддается разумному объяснению, мистика
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)