Спецификаторы аргументов
Материал из Pro-Pawn Wiki
Версия от 07:47, 18 июля 2018; Daniel-Cortez (обсуждение | вклад) (Новая страница: «{{Description | Спецификаторы для обозначения типов аргументов в функциях <code>SetTimerEx()</code>, <code>…»)
Описание:
Спецификаторы для обозначения типов аргументов в функциях
SetTimerEx()
, CallLocalFunction()
и CallRemoteFunction()
.
-
a
- массив.
При использовании данного спецификатора после самого массива следует также передавать его размер, а после спецификатораa
добавить ещё один спецификатор (любой, кромеa
иs
).public MyFunction(const array[], size);
public MyFunction(const array[], size)
{
printf("Размер массива: %d", size);
for (new i = 0; i < size; ++i)
printf("\tarray[%d]: 0x%08x", i, array[i]);
}
public OnGameModeInit()
{
static const array[] = { 0x00112233, 0x44556677, 0x8899AABB };
CallLocalFunction("MyFunction", "ai", array, sizeof(array));
}
-
s
- строка.public MyFunction(const string[]);
public MyFunction(const string[])
{
printf("string: %s", string);
}
public OnGameModeInit()
{
CallLocalFunction("MyFunction", "s", "abc");
}
- Любой другой символ - ячейка Pawn (целочисленное значение, вещественное число и пр.)public MyFunction(a, b, c);
public MyFunction(a, b, c)
{
printf("%d, %d, %d", a, b, c);
}
public OnGameModeInit()
{
// Наиболее частыми являются спецификаторы "i", "d" и "f".
CallLocalFunction("MyFunction", "iii", 1, 2, 3);
// Но на самом деле сервер их не различает и кроме них
// работают любые символы, отличные от "a" и "s".
CallLocalFunction("MyFunction", "абв", 4, 5, 6);
// Даже знаки препинания - все они работают одинаково.
CallLocalFunction("MyFunction", "+-=", 7, 8, 9);
}
Баг SA-MP |
При передаче в SetTimerEx() массивов и строк (спецификаторы a и s соответственно) под них резервируется память в секции стека/кучи скрипта, однако эта память не высвобождается при уничтожении таймера. Многократное создание таймеров с передачей строк или массивов может привести к ошибкам времени выполнения из-за исчерпания свободного места в секции стека/кучи - первопричину такой ошибки очень трудно определить, если не знать о данном баге.
При передаче через SetTimerEx() строка может оказаться повреждена.
|
См. также: