Неограниченное кол-во параметров в функции (массивы...)
#1

Здравствуйте, есть ли возможность сделать в функции неограниченное кол-во параметров чтобы и массивы могли быть в качестве параметров функции?

В вики написано что "getarg НЕ работает с массивами в качестве параметра !", поэтому прошу помощи у вас (перейти).

Заранее благодарю за помощь!
Reply
#2

Я так полагаю имеется в виду что не будет работать при виде функции:
pawn Code:
myFunction(argArray[]) {
}
Данная функция не сможет получить количество аргументов в массиве, но если это будет строка то пожалуйста.
Просто нужно понимать что есть строка, а что массив, в виду того что в pawn это почти одно и то же.
Reply
#3

Quote:
Originally Posted by Stepashka
View Post
Я так полагаю имеется в виду что не будет работать при виде функции:
pawn Code:
myFunction(argArray[]) {
}
Данная функция не сможет получить количество аргументов в массиве, но если это будет строка то пожалуйста.
Просто нужно понимать что есть строка, а что массив, в виду того что в pawn это почти одно и то же.
Ок. Ясно.
А если использовать такой вариант?

pawn Code:
new FALSE = false;
#define SendMessageEx(%0,%1,%2) do{new str[128];format(str, 128, %1, %2);SendClientMessage(%0, -1, str);}while(FALSE)
Просто если можно сделать макрос, зачем тогда сделали через функцию? От нечего делать?:

pawn Code:
#define BYTES_PER_CELL              4

stock SendClientMessageFormatted(playerid, color, fstring[], {Float, _}:...)
{
    static const STATIC_ARGS = 3;
    new n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
    if(n)
    {
        new message[144],arg_start,arg_end;
        #emit CONST.alt        fstring
        #emit LCTRL          5
        #emit ADD
        #emit STOR.S.pri        arg_start

        #emit LOAD.S.alt        n
        #emit ADD
        #emit STOR.S.pri        arg_end
        do
        {
            #emit LOAD.I
            #emit PUSH.pri
            arg_end -= BYTES_PER_CELL;
            #emit LOAD.S.pri      arg_end
        }
        while(arg_end > arg_start);

        #emit PUSH.S          fstring
        #emit PUSH.C          144
        #emit PUSH.ADR         message

        n += BYTES_PER_CELL * 3;
        #emit PUSH.S          n
        #emit SYSREQ.C         format

        n += BYTES_PER_CELL;
        #emit LCTRL          4
        #emit LOAD.S.alt        n
        #emit ADD
        #emit SCTRL          4

        if(playerid == INVALID_PLAYER_ID)
        {
            #pragma unused playerid
            return SendClientMessageToAll(color, message);
        } else {
            return SendClientMessage(playerid, color, message);
        }
    } else {
        if(playerid == INVALID_PLAYER_ID)
        {
            #pragma unused playerid
            return SendClientMessageToAll(color, fstring);
        } else {
            return SendClientMessage(playerid, color, fstring);
        }
    }
}
Есть какая-то разница между вариантом "через макрос" и этим?
Reply
#4

А сам проверить не можешь?
ЗЫ:
pawn Code:
#define TRUE true
#define FALSE false
Reply
#5

Quote:
Originally Posted by Stepashka
View Post
А сам проверить не можешь?
ЗЫ:
pawn Code:
#define TRUE true
#define FALSE false
К сожалению нет. Просто не вижу смысла, могу только предположить что скорость работы разная (функция работает дольше в данном случае).
Reply
#6

Товарищь, вам бы прочитать как работает компилятор...
Reply
#7

Quote:
Originally Posted by Stepashka
View Post
А сам проверить не можешь?
ЗЫ:
pawn Code:
#define TRUE true
#define FALSE false
pawn Code:
#define TRUE false
#define FALSE true
Будь плохим мальчиком.

Не смог удержаться.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)