PDA

Просмотр полной версии : [Вопрос] Floatadd func



vovandolg
07.11.2016, 20:50
Почему такая функция со сложением показывает не точный ответ?


cell AMX_NATIVE_CALL amxNatives::vd_floatadd(AMX *amx, cell *params)
{
float summa = params[1] + params[2] + params[3];

return amx_ftoc(summa);
}

//native Float:vd_floatadd(Float:A, Floa:B, Float:C);

Если посчитать в pawno таким подобным способом то будет правильно.

Daniel_Cortez
07.11.2016, 21:08
Почему такая функция со сложением показывает не точный ответ?


cell AMX_NATIVE_CALL amxNatives::vd_floatadd(AMX *amx, cell *params)
{
float summa = params[1] + params[2] + params[3];

return amx_ftoc(summa);
}

//native Float:vd_floatadd(Float:A, Floa:B, Float:C);


Ты хочешь сложить вещественные числа, но для компилятора они имеют тип cell и он складывает их в целочисленном представлении - естественно, результат будет неправильный. Макрос amx_ftoc нужно использовать не на результате суммы, а на самих слагаемых, чтобы их привести к вещественному типу.



Если посчитать в pawno таким подобным способом то будет правильно.
Не припоминаю, чтобы в этом простом текстовом редакторе был калькулятор.

vovandolg
07.11.2016, 21:13
Ну так если я меняю cell на float или double мне ошибку выдаёт компилятор,
как такую функцию оформить в заголовке чтобы норм компилило?

- - - Добавлено - - -



Не припоминаю, чтобы в этом простом текстовом редакторе был калькулятор.

Pawn pawn)

Daniel_Cortez
07.11.2016, 21:25
Буквально недавно проснулся, поэтому в предыдущем посте не совсем правильно изложил свою мысль.
Макрос amx_ftoc нужно использовать на результате сложения, но этого мало. Аргументы нативной функции передаются в виде целых чисел (cell) в массиве params. Прежде чем складывать числа, нужно "обмануть" компилятор, заставив его думать, что в params[1...3] вещественные числа - это делается с помощью макроса amx_ctof.


float result = amx_ctof(params[1]) + amx_ctof(params[2]) + amx_ctof(params[3]);
return amx_ftoc(result);

vovandolg
07.11.2016, 21:29
То есть в заголовке функции кроме cell задать не чего нельзя я так понимаю?

Да и ещё.. Где можно найти описания функций(на русском если есть) из amx ресурсов или как вернее там?

ziggi
07.11.2016, 21:48
То есть в заголовке функции кроме cell задать не чего нельзя я так понимаю?

cell - это единственный тип данных в Pawn, поэтому да, нельзя.


Да и ещё.. Где можно найти описания функций(на русском если есть) из amx ресурсов или как вернее там?

Мне очень помогла эта инструкция: http://forum.sa-mp.com/showthread.php?t=295798. Нормальной информации на русском не видел (хотя я особо и не искал).
Ещё помогает изучение чужих плагинов.

Daniel_Cortez
07.11.2016, 21:54
То есть в заголовке функции кроме cell задать не чего нельзя я так понимаю?
Вряд ли. Вполне возможно, что есть какой-нибудь способ, связанный с каламбуром типизации, которого я не знаю, но это будет в ущерб читаемости кода.


Да и ещё.. Где можно найти описания функций(на русском если есть) из amx ресурсов или как вернее там?
Лично я смотрел описание в документации к Pawn (в частности, в Pawn Implementer's Guide), да и на оффе есть пара-тройка примеров и замечаний о багах в некоторых функциях из разряда amx_*.