12.02.2013, 02:13
Infinitos parвmetros em funзхes e callbacks
Nнvel avanзado
Vamos dizer que nгo sejam infinitos, mas sim mъltiplos parвmetros em uma callback,
por exemplo a funзгo format traz, iremos aprender a lidar com vбrios parвmetros em uma funзгo e
mudar esta tarefa que sу experientes conseguiam fazer em coisa de iniciante!
Aproveitem este tуpico, pois este material й bem difнcil de se encontrar, nem mesmo a wiki nos traz explicaзхes!
Funзхes
pawn Код:
native numargs(): //pega o nъmero de argumentos que a callback atual possui, comeзгndo pelo 0
native getarg(arg, index=0); //pega o caracter do 'index' do argumento 'arg' (trata-se de uma string para facilitar string[arg][index])
Para declarar na funзгo que desejamos multiparametros, usamos isto como parвmetro
pawn Код:
{Float,_}:... //nгo irei explicar neste tutorial, mas vocк pode usб-lo para todos os tipos de variaveis
//exemplo:
SendFormatedMessage(playerid,color,text,{Float,_}:...){}//simples exemplo aonde vamos transformar uma simples SendClientMessage para SendFormatedMessage.
Na sua funзгo, vocк deverб pegar e trabalhar com os parвmetros passados, neste caso iremos continuar com o exemplo acima.
Obs:A funзгo numargs() pega todos os parвmetros da callback, incluindo playerid, color e text!
Obs:A funзгo getarg(arg, index=0) pega somente o valor de 1 espaзo na variбvel, ou seja й um valor numйrico,
que pode significar um caracter, caso for uma string, vocк deverб concatenar os espaзos ou 'index' em outra string para pegar a informaзгo real!(
pawn Код:
forward SendFormatedMessage(playerid,color,text[128],{Float,_}:...);
public SendFormatedMessage(playerid,color,text[128],{Float,_}:...){
new argumentos = numargs();//pega o nъmero de argumentos da nossa funзгo
//o cуdigo abaixo concatena o valor de 1 espaзo do argumento em outra string para pegar o valor real
//nгo й necessбrio usб-lo caso os argumentos forem numйricos, apenas um exemplo.
new insertargs[15][100];
for(new i = 3; i<argumentos; i++){
for(new c; c<100; c++){
insertargs[i][c] = getarg(i,c);
}
}
//--
//iremos formatar a string com os argumentos concatenados, o esquema й bem simples, mas funcional, lembrando o limite de argumentos que estamos utilizando no format й 10, caso nгo tenham sido definidos na funзгo, serгo ignorados.
format(text,sizeof(text),text,insertargs[3],insertargs[4],insertargs[5],insertargs[6],insertargs[7],insertargs[8],insertargs[9],insertargs[10],insertargs[11],insertargs[12],insertargs[13]);
//e finalmente enviamos a mensagem ao player formatadinha!
return SendClientMessage(playerid,color,text);
}
pawn Код:
//utilizando em nosso script como por exemplo um comando
SendFormatedMessage(0,-1,"Estamos testando a funзгo do %s , serб que tambйm funciona nъmeros? Testamos com o 8 : %d","BlackFire",8);
Код:
Estamos testando a funзгo do BlackFire , serб que tambйm funciona nъmeros? Testamos com o 8 : 8
pawn Код:
forward SendFormatedMessage(playerid,color,text[128],{Float,_}:...);
public SendFormatedMessage(playerid,color,text[128],{Float,_}:...){
new argumentos = numargs();
new insertargs[15][100];
for(new i = 3; i<argumentos; i++){
for(new c; c<100; c++){
insertargs[i][c] = getarg(i,c);
}
}
format(text,sizeof(text),text,insertargs[3],insertargs[4],insertargs[5],insertargs[6],insertargs[7],insertargs[8],insertargs[9],insertargs[10],insertargs[11],insertargs[12],insertargs[13]);
return SendClientMessage(playerid,color,text);
}
Crйditos
BlackFire
iPs Team
Rocks Brasil