Baixe o app para aproveitar ainda mais
Prévia do material em texto
definição, declaração e chamada Funções Funções Em C, um programa é uma coleção de FUNÇÕES. Uma função é um bloco de código que recebe um nome e que tem possivelmente PARÂMETROS. A partir do nome, o bloco de código que forma a função pode ser chamado. 2 Funções CHAMAR uma função significa iniciar a execução de um bloco de código. Caso a função possua parâmetros, durante a CHAMADA dela devem ser indicados ARGUMENTOS que são valores ou variáveis que irão corresponder aos parâmetros da função. Ao final da execução, uma função pode ainda retornar um valor para o código que fez a chamada da função. 3 Definição Geral Uma função deve ser definida conforme o esquema abaixo: ESPEC-DECLARAÇÃO ID( DECL-ID-1, ..., DECL-ID-n ) { CORPO_FUNÇÃO } 4 Definição Geral ID define o nome da função. A lista de declarações DECL-ID-1, ..., DECL- ID-n é dita LISTA de PARÂMETROS da função. Cada ID-i consiste em uma variável com escopo local na função e que irá receber, como valor inicial, o valor passado como ARGUMENTO durante a chamada da função. 5 Definição Geral Se pensarmos no ID de uma função como uma VARIÁVEL GLOBAL, os ESPEC- DECLARAÇÃO definem que características tem este ID: O tipo de dados ( void, int, char *, ... ) Classe de armazenamento ( static ou extern) O tipo de acesso ( const ou volatile ) 6 Definição Geral O CORPO_FUNÇÃO consiste em DECLARAÇÕES de VARIÁVEIS com escopo LOCAL seguidas de COMANDOS. Caso o tipo de dados constante nos ESPEC- DECLARAÇÃO seja diferente de void, deve haver ao menos um comando return ...; no CORPO_FUNÇÃO. 7 Definição de Função (antigo) Por questões de compatibilidade, uma função pode ainda ser definida seguindo o formato originalmente proposto pelos projetistas da linguagem. Neste formato original, o que muda é a forma de se especificar os parâmetros da função: ESPEC-DECLARAÇÃO ID( ID-1,...,ID-n ) DECL-ID-1; ...; DECL-ID-n; { CORPO_FUNÇÃO } 8 Declaração de Funções: Protótipos O ideal é que toda função, antes de ser usada, deve ser declarada. Caso a função encontra-se DEFINIDA no mesmo arquivo e em uma posição antes de seu uso, então a própria DEFINIÇÃO da função serve como DECLARAÇÃO da função. 9 Declaração de Funções: Protótipos Caso contrário, a DECLARAÇÃO da função dever ser feita através de PROTÓTIPOS. Um protótipo é como se fosse um CABEÇALHO para a função, ou seja, o ID da função os ESPEC do tipo retornado pelo função e os ESPEC dos tipos de cada parâmetro da função: ESPEC-DECLARAÇÃO ID( ESPEC-DECL-1, ..., ESPEC-DECL- n ); 10 Declaração de Funções: Protótipos Em uma situação onde uma função f esteja sendo usada sem ter sido antes declarada, então implicitamente o compilador declarada a função como sendo: int f(); 11 Um função f() é diferente de f(void) ! Um função declarada como: int f(); é diferente de uma função declarada como: int f(void); No primeiro caso, o compilador não sabe se a função pode ou não receber argumentos durante a sua chamada. Quer dizer, é perfeitamente válido fazer: int x = f(3.14); int y = f(2.7, 4); int z = f(); 12 Um função f() é diferente de f(void) ! No segundo caso, o compilador é informado explicitamente que a função não deve receber nenhumar argumento. Assim, as duas primeiras linhas do código acima gerariam uma mensagem de erro e apenas a última seria considerada como válida. 13 Lista de Parâmetros Variável Quando se quer especificar uma função que possui uma lista de parâmetros variável em número e tipo, deve-se terminar a declaração dos parâmetros utilizando três pontos ... Por exemplo: void f(int a, char * b, ... ); Qualquer função que use um número variável de parâmetros deve ter ao menos um deles explicitamente declarado. 14 va_arg(), va_start() e va_end() 15 va_arg(), va_start() e va_end() 16 va_arg(), va_start() e va_end() 17 va_arg(), va_start() e va_end() 18 Chamada de Função Chamar uma função significa iniciar a execução de seu corpo de código. Caso a função tenha sido declarada com PARAMETROS, durante a chamada deve ser passados ARGUMENTOS que correspondam em número e tipo com os PARAMETROS da função. PARAMETROS são variáveis locais à função que irão receber como valores iniciais os valores dos ARGUMENTOS utilizados na CHAMADA da função. 19 Chamada de Função 20 Exemplo: CHAMADA por VALOR 1. unsigned modulo(int x) { 2. x = x < 0 ? - x : x ; 3. return x; 4. } 5. int main () { 6. int a = - 2, ma = modulo(a); 7. printf("| %d | = %d\n", a, ma); 8. } 21 Exemplo: simulando CHAMADA por REFERÊNCIA 1. unsigned modulo(int * x) { 2. *x = *x < 0 ? - *x : *x ; 3. return *x; 4. } 5. int main () { 6. int a = - 2, ma = a; 7. modulo(&ma); 8. printf("| %d | = %d\n", a, ma); 9. } 22 Chamadas de Funções com Arranjos O ID de vetores, matrizes e strings são conceitualmente apontadores para o primeiro elemento do arranjo. Assim, ao se usar o nome de vetores, matrizes ou strings em uma chamada de função está-se fazendo uma CHAMADA por REFERÊNCIA. Para evitar que modificações acidentais ocorram com vetores, matrizes e strings passados como argumentos de funções deve-se declará-los utilizando o qualificador const. 23 Chamadas de Funções com Arranjos 1. /* *str não deve ser modificado no interior de strlen */ 2. int strlen(const char str[]) { 3. int i; 4. 5. /* str[0] = 'a'; - qualquer tentativa de modificar o conteúdo da string apontada por str irá gerar uma mensagem de erro ! */ 6. for(i =0; *str; i++, str++); 7. 8. return i; 9. } 24 Chamadas de Funções com Arranjos 1. /*str1 deve ser modificada no interior de strlen 2. já, *str2 não */ 3. int strcpy(char * str1, const char * str2) { 4. int i = 0; 5. 6. /* str2[0] = 'a'; - qualquer tentativa de modificar o conteúdo da string apontada por str2 irá gerar uma mensagem de erro ! */ 7. do 8. str1[i] = str2[i]; 9. while ( str2[i++] ); 10. 11. return i - 1; 12. } 25 Ponteiro para Funções 26 Ponteiro para Funções - Exemplo 1. #include <stdio.h> 2. int compara(int a, int b) { 3. if (b < a) return 1; 4. return 0; 5. } 6. int ordenacao (int *vet, int size, int (* compara)(int a, int b)) { 7. int i, j, tmp, sel; 8. for (i=0; i<size-1; i++) { 9. sel = i; 10. for (j=i+1; j<size; j++) 11. if (compara(vet[sel], vet[j])) 12. sel = j; 13. tmp = vet[i]; 14. vet[i] = vet[sel]; 15. vet[sel] = tmp; 16. } 17. } 27 Ponteiro para Funções - Exemplo 1. int main() { 2. int vet[7] = {5,6,1,2,3,7,4}; 3. int i; 4. ordenacao (vet, 7, compara); 5. for (i=0; i<7; i++) printf("%d ", vet[i]); 6. return 0; 7. } 28
Compartilhar