Спецификаторы аргументов

Материал из Pro-Pawn Wiki
Перейти к: навигация, поиск

Описание:

Спецификаторы для обозначения типов аргументов в функциях SetTimerEx(), CallLocalFunction() и CallRemoteFunction().

Спецификатор(ы) Значение Примечание
s Строка
a Массив Следующим аргументом должен быть размер массива (со спецификатором d/i или любым другим, отличным от a и s).
d, i Целое число
f Вещественное число
b Логическое значение
c Символ


Info rhombus.png
Примечание
Только у спецификаторов a и s есть чёткая функция. Спецификаторы d, i, f, b и c нужны только для читаемости кода - на самом деле сервер их не различает и кроме них могут работать любые другие символы, отличные от a и s.
forward MyFunction(a, b, c);
public  MyFunction(a, b, c)
{
    printf("%d, %d, %d", a, b, c);
}

public OnGameModeInit()
{
    CallLocalFunction("MyFunction", "xyz", 1, 2, 3);
    CallLocalFunction("MyFunction", "абв", 4, 5, 6);
    CallLocalFunction("MyFunction", "+-=", 7, 8, 9);
}


Bug.png
Баг SA-MP
При передаче в SetTimerEx() массивов и строк (спецификаторы a и s соответственно) под них резервируется память в секции стека/кучи скрипта, однако эта память не высвобождается при уничтожении таймера. Многократное создание таймеров с передачей строк или массивов может привести к ошибкам времени выполнения из-за исчерпания свободного места в секции стека/кучи - первопричину такой ошибки очень трудно определить, если не знать о данном баге.
При передаче через SetTimerEx() строка может оказаться повреждена.


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

forward ArrayFunction(const array[], size);
public  ArrayFunction(const array[], size)
{
    printf("Размер массива: %d", size);
    for (new i = 0; i < size; ++i)
        printf("\tarray[%d]: 0x%08x", i, array[i]);
}

forward StringFunction(const string[]);
public  StringFunction(const string[])
{
    printf("string: %s", string);
}

forward ThreeArgFunction(a, Float:b, bool:c);
public  ThreeArgFunction(a, Float:b, bool:c)
{
    printf("%d, %f, %s", a, b, c ? ("true") : ("false"));
}

public OnGameModeInit()
{
    static const array[] = { 0x00112233, 0x44556677, 0x8899AABB };
    CallLocalFunction("ArrayFunction", "ai", array, sizeof(array));

    CallLocalFunction("StringFunction", "s", "abc");

    CallLocalFunction("ThreeArgFunction", "ifb", 1, 2.0, false);
}


См. также: