[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
#2

Bem nessa. Jб tinha pensado nisso... Tem que avisar ao Kalcor, mas agora sу serб possнvel na prуxima versгo que vai demorar um pouco.
Mas bom tutorial, essa callback vai ajudar bastante.
Reply
#3

Quote:
Originally Posted by Etton
Посмотреть сообщение
Bem nessa. Jб tinha pensado nisso... Tem que avisar ao Kalcor, mas agora sу serб possнvel na prуxima versгo que vai demorar um pouco.
Mas bom tutorial, essa callback vai ajudar bastante.
a funзгo de SendFormatedMessage foi sу um exemplo, o foco do tutorial й os multi parвmetros.
Reply
#4

Quote:
Originally Posted by [JD]BlackFire
Посмотреть сообщение
a funзгo de SendFormatedMessage foi sу um exemplo, o foco do tutorial й os multi parвmetros.
Beleza. Mas foquei mesmo foi nesta callback.
Reply
#5

Quote:
Originally Posted by Etton
Посмотреть сообщение
Beleza. Mas foquei mesmo foi nesta callback.
eu ainda creio que nгo irгo implementar uma funзгo assim, mas nunca se sabe.
Reply
#6

Bom tuto, tem na board ENG, mas atй hoje nгo tinha visto aqui na board BR. muito bom
Reply
#7

Excelente BlackFire. Dei muito trabalho pra achar e aprender sobre essas funзхes de arg(argumentos).
Repetindo a mensagem do Schocc e que tambйm vai ajudar muitos.

Nice tutorial bro.
Reply
#8

Relativamente isto й bastante desotimizado. mas enfim, a intenзгo й boa.
Reply
#9

Quote:
Originally Posted by leonardo1434
Посмотреть сообщение
Relativamente isto й bastante desotimizado. mas enfim, a intenзгo й boa.
Relativamente.


Esqueceu de citar que os parвmetros infinitos devem estar depois dos normais:


Wrong
pawn Код:
stock MinhaFuncao(...,playerid);



Correct
pawn Код:
stock MinhaFuncao(playerid, ...);

PS: Bom tutorial.
Reply
#10

Excelente tutorial.

Revirei vбrios scripts atй entender o funcionamento de parametros infinitos, esse tutorial realmente estava faltando na board (:
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)