Спецификаторы аргументов — различия между версиями
Материал из Pro-Pawn Wiki
(Новая страница: «{{Description | Спецификаторы для обозначения типов аргументов в функциях <code>SetTimerEx()</code>, <code>…») |
|||
(не показана одна промежуточная версия этого же участника) | |||
Строка 2: | Строка 2: | ||
| Спецификаторы для обозначения типов аргументов в функциях <code>[[SetTimerEx]]()</code>, <code>[[CallLocalFunction]]()</code> и <code>[[CallRemoteFunction]]()</code>. | | Спецификаторы для обозначения типов аргументов в функциях <code>[[SetTimerEx]]()</code>, <code>[[CallLocalFunction]]()</code> и <code>[[CallRemoteFunction]]()</code>. | ||
}} | }} | ||
− | + | {| class="wikitable" | |
− | </ | + | ! Спецификатор(ы) |
− | + | ! Значение | |
− | public MyFunction( | + | ! Примечание |
+ | |- | ||
+ | | <code>s</code> | ||
+ | | Строка | ||
+ | | | ||
+ | |- | ||
+ | | <code>a</code> | ||
+ | | Массив | ||
+ | | Следующим аргументом должен быть размер массива (со спецификатором <code>d</code>/<code>i</code> или любым другим, отличным от <code>a</code> и <code>s</code>). | ||
+ | |- | ||
+ | | <code>d</code>, <code>i</code> | ||
+ | | Целое число | ||
+ | | | ||
+ | |- | ||
+ | | <code>f</code> | ||
+ | | Вещественное число | ||
+ | | | ||
+ | |- | ||
+ | | <code>b</code> | ||
+ | | Логическое значение | ||
+ | | | ||
+ | |- | ||
+ | | <code>c</code> | ||
+ | | Символ | ||
+ | | | ||
+ | |} | ||
+ | |||
+ | |||
+ | {{NoteInfo | ||
+ | | Только у спецификаторов <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> | ||
+ | forward MyFunction(a, b, c); | ||
+ | public MyFunction(a, b, c) | ||
{ | { | ||
− | + | printf("%d, %d, %d", a, b, c); | |
− | + | ||
− | + | ||
} | } | ||
public OnGameModeInit() | public OnGameModeInit() | ||
{ | { | ||
− | + | CallLocalFunction("MyFunction", "xyz", 1, 2, 3); | |
− | + | CallLocalFunction("MyFunction", "абв", 4, 5, 6); | |
+ | CallLocalFunction("MyFunction", "+-=", 7, 8, 9); | ||
} | } | ||
− | </pawn>< | + | </pawn> |
+ | }} | ||
+ | {{NoteSAMPBug | ||
+ | | При передаче в <code>[[SetTimerEx]]()</code> массивов и строк (спецификаторы <code>a</code> и <code>s</code> соответственно) под них резервируется память в секции стека/кучи скрипта, однако эта память не высвобождается при уничтожении таймера. Многократное создание таймеров с передачей строк или массивов может привести к ошибкам времени выполнения из-за исчерпания свободного места в секции стека/кучи - первопричину такой ошибки очень трудно определить, если не знать о данном баге. | ||
+ | | При передаче через <code>[[SetTimerEx]]()</code> строка может оказаться повреждена. | ||
+ | }} | ||
− | + | {{Example}} | |
− | + | <pawn> | |
− | public | + | forward ArrayFunction(const array[], size); |
+ | public ArrayFunction(const array[], size) | ||
{ | { | ||
− | printf(" | + | printf("Размер массива: %d", size); |
+ | for (new i = 0; i < size; ++i) | ||
+ | printf("\tarray[%d]: 0x%08x", i, array[i]); | ||
} | } | ||
− | public | + | 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) | |
− | public | + | |
{ | { | ||
− | + | printf("%d, %f, %s", a, b, c ? ("true") : ("false")); | |
} | } | ||
public OnGameModeInit() | public OnGameModeInit() | ||
{ | { | ||
− | + | static const array[] = { 0x00112233, 0x44556677, 0x8899AABB }; | |
− | CallLocalFunction(" | + | CallLocalFunction("ArrayFunction", "ai", array, sizeof(array)); |
− | + | CallLocalFunction("StringFunction", "s", "abc"); | |
− | + | ||
− | + | ||
− | + | CallLocalFunction("ThreeArgFunction", "ifb", 1, 2.0, false); | |
− | CallLocalFunction(" | + | |
} | } | ||
</pawn> | </pawn> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{{SeeAlso}} | {{SeeAlso}} | ||
* [[SetTimerEx]] | * [[SetTimerEx]] |
Текущая версия на 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);
}
См. также: