Ir para conteúdo
Fórum Script Brasil
  • 0

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


bruce845

Pergunta

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!

Editado por bruce845
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...