Protótipo

1. Protótipo

Gustavo
jucao

(usa Debian)

Enviado em 14/03/2009 - 02:25h

Olá pessoal, estou escrevendo uma fila e tenho o seguinte erro no protótipo da função erro quando tento compilar:

fila.c:4: error: expected ‘;’, ‘,’ or ‘)’ before ‘.’ token
fila.c:32: error: expected ‘;’, ‘,’ or ‘)’ before ‘.’ token

e aqui é o código completo:

# include <stdio.h>
# include <stdlib.h>

void inclusao(char aux.nome[21], int aux.idade);

struct nodo{
char nome[21];
int idade;
struct nodo *elo; /* struct do mesmo tipo */
};

struct nodo *novo = NULL;
struct nodo *frente = NULL;
struct nodo *re = NULL;

int main(void)
{
char nome1[21];
int idade1;

printf("\t\tFILA\n");

printf("Insira a nome:");
gets (nome1);

printf("Insira a idade:");
scanf("%d",&idade1);

return (0);
}

void inclusao(char aux.nome[21], int aux.idade)
{
novo = malloc (sizeof(struct nodo)); /* aloca 'novo' para tamanho da struct nodo */

if(novo==NULL){
printf("Erro: a memória não pôde ser alocada");
fflush(stdin);
exit(1);
}
}


Sei que é pouca coisa...alguém sabe?


  


2. Re: Protótipo

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 14/03/2009 - 09:42h

Olá,

Bom, no protótipo de sua função, você insere o ponto. Este operador é que esta lhe causando dor de cabeça. Retire o ponto, use outra nome para o atributo.
Outra coisa, Não coloque o tamanho, faço o controle dentro da função, fica mais elegante, evitando assim, usar números mágicos.


3. Re: Protótipo

Ronaldo Faria Lima
ron_lima

(usa Slackware)

Enviado em 15/03/2009 - 23:12h

Vamos lá. O seu protótipo, ao contrário do que a grande maioria das pessoas acredita, não precisa ter os identificadores das variáveis. Basta conter as definições dos tipos:

void inclusao(char [21], int);

Na definição da função é necessário descrever os identificadores. Esse é um efeito da premissa dos protótipos: identificar os tipos de retorno e de aquisição de dados via parâmetros. Para o compilador, não interessa os identificadores. É prática comum manter os identificadores dos parâmetros por uma questão de documentação de código.

O fato é que os identificadores, caso mantidos nos protótipos das funções, devem seguir as regras que governam os identificadores da linguagem. O operador "." é utilizado para dar acesso a um campo de uma estrutura de dados, onde a primeira parte é o identificador da estrutura e a segunda o nome do campo acessado.

A forma como você declarou os parâmetros da sua função "inclusao" está completamente errada, visto que não são identificadores válidos. Um identificador não pode conter operadores e foi exatamente isso o que você fez: declarou dois parâmetros com operadores como parte dos identificadores.

Com relação ao tamanho dos vetores, é prática também definir os tamanhos por meio de constantes literais. Por exemplo, o tamanho do campo nome poderia ser definido como sendo:

#define NOME_LEN 20

A declaração do campo nome ficaria:

struct nodo{
  char nome[NOME_LEN + 1];
  int idade;
  struct nodo *elo; /* struct do mesmo tipo */
};

A declaração do campo nome também é um dialeto comum. Você poderia muito bem definir a constante NOME_LEN como tendo 21 posições e ignorar o "+ 1" na declaração. Porém, é um dialeto comum definir o tamanho dos campos como constantes "justas", deixando o ajuste do '\ 0' para a declaração das variáveis. Esse dialeto é muito interessante por permitir que você manipule os dados usando as constantes em situações nas quais você não vai levar em conta o '\ 0'. Por exemplo:

if (strlen (nome) == NOME_LEN) {
  /*...*/
}

Bem, espero ter podido ajudar com sua dúvida.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts