Спецификаторы аргументов — различия между версиями
Материал из Pro-Pawn Wiki
Строка 36: | Строка 36: | ||
| Только у спецификаторов <code>a</code> и <code>s</code> есть чёткая функция. Спецификаторы <code>d</code>, <code>i</code>, <code>f</code>, <code>b</code> и <code>c</code> нужны только для читаемости кода - на самом деле сервер их не различает и кроме них могут работать любые другие символы, отличные от <code>a</code> и <code>s</code>. | | Только у спецификаторов <code>a</code> и <code>s</code> есть чёткая функция. Спецификаторы <code>d</code>, <code>i</code>, <code>f</code>, <code>b</code> и <code>c</code> нужны только для читаемости кода - на самом деле сервер их не различает и кроме них могут работать любые другие символы, отличные от <code>a</code> и <code>s</code>. | ||
<pawn> | <pawn> | ||
− | + | forward MyFunction(a, b, c); | |
− | public MyFunction(a, b, c) | + | public MyFunction(a, b, c) |
{ | { | ||
printf("%d, %d, %d", a, b, c); | printf("%d, %d, %d", a, b, c); | ||
Строка 57: | Строка 57: | ||
{{Example}} | {{Example}} | ||
<pawn> | <pawn> | ||
− | + | forward ArrayFunction(const array[], size); | |
− | public ArrayFunction(const array[], size) | + | public ArrayFunction(const array[], size) |
{ | { | ||
printf("Размер массива: %d", size); | printf("Размер массива: %d", size); | ||
Строка 65: | Строка 65: | ||
} | } | ||
− | + | forward StringFunction(const string[]); | |
− | public StringFunction(const string[]) | + | public StringFunction(const string[]) |
{ | { | ||
printf("string: %s", string); | printf("string: %s", string); | ||
} | } | ||
− | + | forward ThreeArgFunction(a, Float:b, bool:c); | |
− | public ThreeArgFunction(a, Float:b, bool:c) | + | public ThreeArgFunction(a, Float:b, bool:c) |
{ | { | ||
printf("%d, %f, %s", a, b, c ? ("true") : ("false")); | printf("%d, %f, %s", a, b, c ? ("true") : ("false")); |
Текущая версия на 18:34, 6 октября 2018
Описание:
Спецификаторы для обозначения типов аргументов в функциях
SetTimerEx()
, CallLocalFunction()
и CallRemoteFunction()
.
Спецификатор(ы) | Значение | Примечание |
---|---|---|
s
|
Строка | |
a
|
Массив | Следующим аргументом должен быть размер массива (со спецификатором d /i или любым другим, отличным от a и s ).
|
d , i
|
Целое число | |
f
|
Вещественное число | |
b
|
Логическое значение | |
c
|
Символ |
Баг 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);
}
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);
}
См. также: