Неограниченное кол-во параметров в функции (массивы...) -
Ted67 - 11.11.2013
Здравствуйте, есть ли возможность сделать в функции неограниченное кол-во параметров чтобы и массивы могли быть в качестве параметров функции?
В вики написано что "getarg
НЕ работает с массивами в качестве параметра !", поэтому прошу помощи у вас (
перейти).
Заранее благодарю за помощь!
Re: Неограниченное кол-во параметров в функции (массивы...) -
Stepashka - 12.11.2013
Я так полагаю имеется в виду что не будет работать при виде функции:
pawn Code:
myFunction(argArray[]) {
}
Данная функция не сможет получить количество аргументов в массиве, но если это будет строка то пожалуйста.
Просто нужно понимать что есть строка, а что массив, в виду того что в pawn это почти одно и то же.
Re: Неограниченное кол-во параметров в функции (массивы...) -
Ted67 - 12.11.2013
Quote:
Originally Posted by Stepashka
Я так полагаю имеется в виду что не будет работать при виде функции:
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);
}
}
}
Есть какая-то разница между вариантом "через макрос" и этим?
Re: Неограниченное кол-во параметров в функции (массивы...) -
Stepashka - 13.11.2013
А сам проверить не можешь?
ЗЫ:
pawn Code:
#define TRUE true
#define FALSE false
Re: Неограниченное кол-во параметров в функции (массивы...) -
Ted67 - 13.11.2013
Quote:
Originally Posted by Stepashka
А сам проверить не можешь?
ЗЫ:
pawn Code:
#define TRUE true #define FALSE false
|
К сожалению нет. Просто не вижу смысла, могу только предположить что скорость работы разная (функция работает дольше в данном случае).
Re: Неограниченное кол-во параметров в функции (массивы...) -
Mutha_X - 13.11.2013
Товарищь, вам бы прочитать как работает компилятор...
Re: Неограниченное кол-во параметров в функции (массивы...) -
eakwarp - 13.11.2013
Quote:
Originally Posted by Stepashka
А сам проверить не можешь?
ЗЫ:
pawn Code:
#define TRUE true #define FALSE false
|
pawn Code:
#define TRUE false
#define FALSE true
Будь плохим мальчиком.
Не смог удержаться.