PDA

Просмотр полной версии : [Function] itos



Daniel_Cortez
27.07.2013, 21:31
Описание:

Преобразуюет число в строку.

Параметры:

num - число, которое нужно преобразовать
buffer - строковая переменная, в которую будет записан результат
size - размер строковой переменной (необязательный параметр)


Возвращаемое значение:

Длина числа в строковом представлении.
Также возвращает строковое представление числа в buffer.

Плюсы реализации:
Функция проста в использовании
С использованием JIT работает более 10 раз быстрее, чем format
Нет багов которые есть в функциях valstr (зависание сервера при попытке вывода больших чисел) и format (вывод только знака "-" вместо "-2147483648")

Минусы реализации:
N/A

Код:

stock itos(num, buffer[], size=sizeof(buffer))
{ // by Daniel_Cortez \\pro-pawn.ru
new fix_cellmin = (num == cellmin) ? ++num : 0;
new pos = 0;
if(num < 0)
buffer[0] = '-', pos++, num = -num;
{
new x = num;
do{
x /= 10;
pos++;
}while(x);
}
buffer[(--size<pos) ? size : pos] = EOS;
new len = (size>pos) ? pos : size;
new mod;
do{
/*if(--pos < size)
buffer[pos] = '0'+num%10;
num /= 10;*/
// make 1 "sdiv" operation instead of 2
#emit load.s.pri num
#emit const.alt 10
#emit sdiv
#emit stor.s.pri num
#emit stor.s.alt mod
if(--pos < size)
buffer[pos] = '0'+mod;
}while(num);
if(fix_cellmin)
buffer[10]++;
return len;
}

Пример использования:

// Вывод имени игрока и его ID без использования format().
// Пример результата: "Daniel_Cortez (0)".
CMD:myname(playerid, params[])
{
new string[MAX_PLAYER_NAME+2+11+1+1];
new len = GetPlayerName(playerid, string, sizeof(string);
string[len++] = ' ', string[len++] = '(';
len += itos(playerid, string[len], 12);
string[len] = ')', string[len+1] = EOS;
return SendClientMessage(playerid, -1, string);
}

Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)

Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других порталах без разрешения автора запрещено!

execution
12.07.2019, 12:03
Я правильно понимаю, что если массив заполнен некоторыми данными, то запишет в первую свободную ячейку?

Daniel_Cortez
12.07.2019, 14:03
Нет, функция этого не делает. ИМХО, на самом деле не так уж и много сценариев использования этой функции: например, сделать отсчёт времени с показом через GameText, либо вывести текущую скорость машины и количество бензина в ней через TextDraw. В остальных случаях вы, скорее всего, захотите воспользоваться format(), чтобы не возиться с конкатенацией строк.

MassonNN
05.01.2020, 01:49
Велосипед ?

https://wiki.sa-mp.com/wiki/Valstr

DeimoS
05.01.2020, 09:45
Велосипед ?

https://wiki.sa-mp.com/wiki/Valstr

А если тему внимательнее почитать?



Плюсы реализации:
Функция проста в использовании
С использованием JIT работает более 10 раз быстрее, чем format
Нет багов которые есть в функциях valstr (зависание сервера при попытке вывода больших чисел) и format (вывод только знака "-" вместо "-2147483648")

Особенно третий пункт (о чём, собственно, даже на wiki.sa-mp написано)