SA-MP Forums Archive
Проблема с дробными значениями - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Проблема с дробными значениями (/showthread.php?tid=347511)



Проблема с дробными значениями - 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

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

А вот если
pawn Код:
new Float:f;
f = f + 10;
То всё окей. Я думаю в этом у Вас проблема (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
Посмотреть сообщение
О, насколько я помню, если
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;



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)
А если выводить так
pawn Код:
printf("%f", a);
То вывод: 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

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