Fork me on GitHub

18/10/14

TUTORIAL: Ellipsis

TUTORIAL: Ellipsis


Em todas as funções que criamos, o número de parâmetros deve ser conhecido com antecedência. Mas a linguagem C permite que passamos quantos parâmetros quiser para uma chamada de função. Para isso a linguagem fornece o especificador ellipsis ( ou reticências ).


A ellipsis deve ser sempre o último parâmetro da função e seus componentes devem ser do mesmo tipo.

EXEMPLO:
unsigned CalcularMedia( char n, ... )
{ char i; unsigned res = 0; for( i = 1; i <= n; i++ ) res += ((char*)&n)[i]; //aponta para o i-esimo parametro e recupera o valor return ( res / n ); }

A ellipsis "informa" ao compilador que a função CalcularMedia poderá conter x parâmetros. Você deve saber que o compilador aloca os parâmetros sequencialmente, isto quer dizer que, na memoria, supondo que o primeiro parâmetro ( todos do tipo char ) ocupa o endereço 44, o segundo parâmetro irá ocupar o endereço 45, o terceiro parâmetro irá ocupar o endereço 46 e, assim por diante. O que temos que fazer é simplesmente apontar para o primeiro parâmetro da sequência e "caminhar" nesta sequência, recuperando assim seus valores.

OUTRO EXEMPLO:
unsigned CalcularMedia( char n, ... )
{
char i;
unsigned res = 0;
     for( i = 1; i <= n; i++ )
          res += ((char*)&n)[i];
     return ( res / n );
}

void Print( char * str, ... )
{
char **ptr = &str;
     while( *ptr )
       Uart1_Write_Text( *ptr++ );
}

char Texto[10];

void main() 
{
    UART1_Init(9600);
    
    {
      //calcula a media aritmetica dos 10 primeiros elementos
      unsigned media = CalcularMedia( 10, 11, 3, 4, 5, 6, 6, 8, 7, 6, 14 );
      WordToStr( media, Texto ); //converte o resultado para string
      //Imprime varias strings
      //Obs.: Adicione (char*) para evitar que o compilador salve a string na memoria flash
      Print( "Media Aritmetica: ", Texto, (char*)"\r\n", 0 );
    }
}

2 comentários:

  1. Sugestão para o próximo post : PIC com Módulo ENC28j60. Implementado no MikroC, esta dificil encontrar na rede.

    ResponderExcluir
    Respostas
    1. E ai amigo conseguiu implementar o ENC com o MikroC? Também só encontro exemplos do CCS.

      Excluir

Postagens Relacionadas!!