[Tutorial] Infinitos parвmetros em funзхes [Avanзado]
#1


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])
Callbacks
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.
Pegar parвmetros
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);
}
Resultado da funзгo SendFormatedMessage(playerid,color,text[128],{Float,_}:...):
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);
Copiado do console do sa-mp ao realizar testes:
Код:
Estamos testando a funзгo do BlackFire , serб que tambйm funciona nъmeros? Testamos com o 8 : 8
Funзгo usada para exemplo pronta para uso
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);
}
Falando serio, esta funзгo jб deveria existir por padrгo no sa-mp, й bastante ъtil!

Crйditos
BlackFire
iPs Team
Rocks Brasil

Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 3 Guest(s)