Спецификаторы аргументов — различия между версиями

Материал из 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>
public MyFunction(a, b, c);
+
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>
public ArrayFunction(const array[], size);
+
forward ArrayFunction(const array[], size);
public ArrayFunction(const array[], size)
+
public ArrayFunction(const array[], size)
 
{
 
{
 
printf("Размер массива: %d", size);
 
printf("Размер массива: %d", size);
Строка 65: Строка 65:
 
}
 
}
  
public StringFunction(const string[]);
+
forward StringFunction(const string[]);
public StringFunction(const string[])
+
public StringFunction(const string[])
 
{
 
{
 
     printf("string: %s", string);
 
     printf("string: %s", string);
 
}
 
}
  
public ThreeArgFunction(a, Float:b, bool:c);
+
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 Символ


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);
}


См. также: