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

Материал из 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);
    }


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



См. также: