Jump to content
Fórum Script Brasil
  • 0

Numero variável de parâmetros na função


bruce845

Question

Todos já viram como faz uma função, mas se alguém ficou curioso para saber como funciona algumas funções no C/C++ como a printf() e scanf() que a quantidade de argumentos é variável, fique sabendo que é possível fazer isso com qualquer função. Veja como fazer:

Sempre inclua a biblioteca stdarg.h no C ou cstdarg no C++ para usar as funções de parâmetros variáveis.

Existem 3 funções e um tipo de dado que irão ser necessárias dentro da função na qual vai querer ter parâmetros indefinidos, São elas:

void va_arg(va_list argptr,tipo de dado do parâmetro variável);

type va_start(va_list argptr,nome do último parâmetro conhecido);

void va_end(va_list argptr);

Para fazer uma função com número variável de argumentos, faça o seguinte:

  1. Inclua a biblioteca stdarg.h no C ou cstdarg no C++;
  2. Declare a função com pelo menos um parâmetro conhecido (para o controle do número de argumentos variáveis que irão ser passados na função);

    Ex.: void imprimeStrings(int parametroConhecido,...); (inclua reticências no lugar do segundo parâmetro)

  3. Sempre encerre a função com a função va_end();
Exemplo de programa:


#include <stdio.h>
#include <stdarg.h> // Sempre inclua essa biblioteca!
#include <conio.h> // Biblioteca para a função getch().

void imprimeNumeros(int ,...);

int main(int argc,char **argv)
{
imprimeNumeros(5,5,4,3,2,1);
getch();
imprimeNumeros(4,5,4,3,2);
getch();
return 0;
}
void imprimeNumeros(int quantidadeDeParametros,...)
{
int numero;
int contador;
va_list argptr; // Declare uma variável do tipo va_list na função, o nome "argptr" pode ser trocado.
va_start(argptr,quantidadeDeParametros); /* Inicie a função va_start colocando o nome da variável de tipo va_list declarada anteriormente e o nome do último parâmetro conhecido*/
for(contador=1;contador<=quantidade;contador++) /* Estabeleça uma forma de controle, pois a função não saberá quantos parâmetros recebeu.*/
{
numero=va_arg(argptr,int);
printf("%d\n",numero);
/* Cada vez que for acionada, a va_arg retornará o valor de um parâmetro variável, caso acabem os parâmetros variáveis, ele retornará lixo de memória, necessitando de um controle. O va_arg tem como parâmetro a variável va_list declarada anteriormente e o tipo de dado do argumento variável.*/
}
va_end(argptr); // Sempre coloque a função va_end no final. A va_end recebe o nome da variável va_list declarada anteriormente.
return;
}
[/codebox]

Vale lembrar que a função não sabe quantos argumentos variáveis recebeu e o tipo delas (se é int, float, etc.) e o va_arg sempre que for acionada, retornará um parâmetro variável. Quando acabar os parâmetros variáveis, ele retornará lixo de memória.

O primeiro parâmetro da função deve ser um meio da função saber quantos parâmetros que está recebendo.

Espero ter ajudado!

Edited by bruce845
Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...