Struct - Ajuda

1. Struct - Ajuda

Danillo Costa
hellnux

(usa Kurumin)

Enviado em 05/10/2005 - 17:31h

Olá.

Meu professor de programação passou o seguinte código, do qual foi necessário 3 dias de aulas para passar ele por completo, por este motivo ele não explicou muito sobre os comandos envolvidos no código-fonte.

Eu tento compilar ele com o gcc, mas retorna o seguinte erro:
----------
kurumin@kurumin:~$ gcc struct.c -o struct
struct.c:63: error: conflicting types for `abrir'
struct.c:22: error: previous declaration of `abrir'
struct.c:277:10: warning: no newline at end of file
----------

O que posso fazer???

------------------------
#include<stdio.h>

#include<string.h>
#include<stdlib.h>
#include<ctype.h>

struct registro{
char nome[40];
char rua[40];
char bairro[20];
char fone[15];
char status[1];
}reg;

FILE*fp;

/*prototipos das funções*/
void incluir(void),
consultar(void),
excluir(void),
alterar(void),
abrir(void),
listar(void);
/*fim prototipo*/

/*int para devc troca por viod*/
int main(void){/*a*/
char opcao[2],op;
do{/*b*/
do{/*c*/
void clrscr();
printf("\nCadastro de endere‡os\n");
printf("\nDigite uma das opcoes\n\n");
printf("\n i -incluir");
printf("\n a -alterar");
printf("\n e -excluir");
printf("\n c -consultar");
printf("\n l -listar");
printf("\n s -sair");
printf("\nopcao:");
gets(opcao);
op=tolower(*opcao);
}while(!strchr("iaesls",op));/*c*/

switch(op)
{/*d*/
case'i':incluir();break;
case'a':alterar();break;
case'e':excluir();break;
case'c':consultar();break;
case'l':listar();break;
case's':exit(0);
}/*d*/

}while(1);/*b*/
return(0);
}/*a*/

/*programa principal acima*/

/*primeira função*/
int abrir (char tipo[3])
{
if ((fp=fopen("clientes.dat",tipo)) == NULL)
{
printf("\n O arquivo nao pode ser aberto!!\n");
__fpurge(stdin);
getchar();
exit(1);
}
return(0);
}/*fechando a primeira função*/

/*segunda função*/
void incluir(void){
abrir("ab+");
fseek(fp,0L,SEEK_END);
printf("Digite o nome ou <FIM> para sair \n");
gets(reg.nome);

while((strcmp(reg.nome,"fim")!=0)&&(strcmp(reg.nome,"FIM")!=0))
{
printf("\n Rua:");gets(reg.rua);
printf("\n Bairro:");gets(reg.bairro);
printf("\n Fone:");gets(reg.fone);
strcpy(reg.status,"1");
if(fwrite(®,sizeof(struct registro),1,fp)!=1)
{
printf("\n Erro de grav‡ao!!");
__fpurge(stdin);
getchar();
}else{
printf("\n grava‡ao feita com sucesso...\n\n");
}
printf("\n Digite o nome ou <FIM>para sair \n");
gets(reg.nome);
}
fclose(fp);
}


/* 22/09/2005 */

int busca (void){
int achou=-1,posicao=0;
char nomep[40];
abrir("rb");
printf("\n Digite o nome a ser procurado:");
gets(nomep);
rewind(fp); //posiciona o ponteiro no come‡o do arquivo

while((!feof(fp))&&(achou==-1))
{
fread(®,sizeof(struct registro),1,fp);
// na 2 execucao, o fread aponta p/ o proximo registro
if(!feof(fp))
{ if(strcmp(nomep,reg.nome)== 0) //se for V retorna '0'
{ if(reg.status=="0")
{ posicao=-2; } // o q vc procura esta com status 0
achou=-1; // -1 e q achou
} else{ posicao++; }
} else{ posicao=-1; }
}
if(achou==-1)
{ posicao=-1; }

fclose(fp); //fecha o arquivo no end do ponteiro
return(posicao);
} /*** FIM ***/

void consultar (void){
int pos;
pos=busca();
if(pos==-1)
{
printf("\n Nome inexistente no arquivo!");
__fpurge(stdin);
getchar();
}else if(pos==-2){
printf("\n Nome excluido do arquivo");
__fpurge(stdin);
getchar();
}else{
abrir("rb+");
fseek(fp,pos*sizeof(struct registro),SEEK_SET);
/*
aponte a partir do começo,numero da pos * 116
se fp=1000 e numero da poscicao=0
1000+0=100
*/
fread(®,sizeof(struct registro),1,fp);
printf("\n Nome: %s",reg.nome);
printf("\n Rua: %s",reg.rua);
printf("\n Bairro: %s",reg.bairro);
printf("\n Fone: %s",reg.fone);
__fpurge(stdin);
getchar();
}
fclose(fp);
} /*** FIM ***/

void alterar(void){
int pos;
pos=busca();
if(pos==-1)
{
printf("\n Nome inexistente no arquivo!");
__fpurge(stdin);
getchar();
}else if(pos==-2){
printf("\n Nome excluido do arquivo");
__fpurge(stdin);
getchar();
} else {
abrir("rb+");
fseek(fp,pos*sizeof(struct registro),SEEK_CUR);
printf("\n Certifique que vcrealmente e este registro que vc deseja alterar...");
printf("\n Nome: %s",reg.nome);
printf("\n Rua: %s",reg.rua);
printf("\n Bairro: %s",reg.bairro);
printf("\n Fone: %s",reg.fone);
__fpurge(stdin);
getchar();
printf("\n Digite as informaoes corretas:");
printf("\n Nome:"); gets(reg.nome);
printf("\n Rua:"); gets(reg.rua);
printf("\n Bairro:"); gets(reg.bairro);
printf("\n Fone:"); gets(reg.fone);
strcpy(reg.status,"1"); //ou reg.status='1';
fseek(fp,pos*sizeof(struct registro),SEEK_SET);
if(fwrite(®,sizeof(struct registro),1,fp)!=1)
{
printf("\n ERRO DE GRAVACAO...");
__fpurge(stdin);
getchar();
}else{
printf("\n Regravacao feita com sucesso...");
__fpurge(stdin);
getchar();
}
}
fclose(fp);
} /*** FIM ***/

/*
SEEK_SET - onde eu quero
CUR - começo
END - final
*/
void listar (void){
int cont;
abrir("rb+");
fseek(fp,0L,SEEK_SET);
while(!feof(fp)){
fread(®,sizeof(struct registro),1,fp);
if(reg.status!="0")
{
printf("\n Nome: %s",reg.nome);
printf("\n Rua: %s",reg.rua);
printf("\n Bairro: %s",reg.bairro);
printf("\n Fone: %s",reg.fone);
getch(); cont++;
}
} /*while*/
printf("\n #REGISTROS= %d",cont);
__fpurge(stdin);
getchar();
} /*listar()*/

void excluir (void){ /* A */
int pos;
pos=busca();
if(pos==-1)
{
printf("\n NOME EXISTENTE NO ARQUIVO");
__fpurge(stdin);
getchar();
} else
{ /* B */
if(pos==-2)
{
printf("\n NOME EXCLUIDO DO ARQUIVO");
__fpurge(stdin);
getchar();
} else
{ /* C */
abrir("rb+");
fseek(fp,pos*sizeof(struct registro),SEEK_SET);
/*
rewind pode substituir o fseek q posiciona no começo
e o rewind na pos corrente
*/
fread(®,sizeof(struct registro),1,fp);
printf("\n Nome: %s",reg.nome);
printf("\n Rua: %s",reg.rua);
printf("\n Bairro: %s",reg.bairro);
printf("\n Fone: %s",reg.fone);
printf("\n ESTE REGISTRO # %d SERA EXCLUIDO!",(pos+1));
__fpurge(stdin);
getchar();
strcpy(reg.status,"0"); //
fseek(fp,pos*sizeof(struct registro),SEEK_SET);
if(fwrite(®,sizeof(struct registro),1,fp)!=1)
{
printf("\n ERRO NA GRAVACAO...");
__fpurge(stdin);
getchar();
} else
{
printf("\n EXCLUSAO FEITA COM SUCESSO!");
__fpurge(stdin);
getchar();
}
} /* C */
} /* B */
fclose(fp);
} /* A */
--------------------------------

Qualquer coisa posso enviar o código por e-mail.Obrigado.

HeLLnuX Linuxzando...
Até.


  


2. Re: Struct - Ajuda

Daniel
code0

(usa Slackware)

Enviado em 05/10/2005 - 17:59h

Kra, no header das funcoes vc definiu abrir como uma funcao que nao recebe argumentos, mas seu codigo recebe um char *.
abrir(void);
abrir(char tipo[4])
{
...
}

Mude o prototipo dela para void abrir(char tipo[4]) que deve funcionar.

Em todas as definicoes de prototipo vc nao definiu o tipo da funcao. Defina isso.

Provavelmente estas correcoes resolvam os 2 problemas, se nao posta de novo.

[]'s



3. Re: Struct - Ajuda

Ricardo Rodrigues Lucca
jllucca

(usa Gentoo)

Enviado em 11/10/2005 - 16:20h

Fora isso o que o nosso colega já disse, os prototipos são seguidos de ";" e não ",". O prototipo é uma especie de assinatura da função que engloba: tipo de retorno, nome e lista de tipos de parametros. Cada prototipo representar uma unica função. Assim, "casamentos" como o que voce tentou fazer resultam em erros. Uma sugestão para o uso do gcc é sempre que chama-lo utilizar as flags "-pedantic -ansi" que faz o gcc verificar e só aceitar o codigo que ficaria compativel com o padrão ansi.


4. Re: Struct - Ajuda

Felipe Abella
FelipeAbella

(usa Debian)

Enviado em 10/12/2005 - 19:08h

O warning no final eh porque voce nao pulou uma linha no fim do codigo


5. Re: Struct - Ajuda

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 21/02/2006 - 20:56h

Isso é uma coisa que não entendo. Por que o GCC e o CC cobram que o codigo tenha uma linha vazia depois do codigo (newline)?




6. Opa.

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/03/2006 - 11:32h

struct registro{
char nome[40];
char rua[40];
char bairro[20];
char fone[15];
char status[1];
}reg;

Pelo o que eu aprendi, depois da chave que finaliza a declaração da struct, deve estar escrito o nome dela. O nome da variável estruturada é registro, né? Por que você escreveu reg ao invés de registro depois da chave? Esse deve ser o problema-pai disso tudo, humm...


7. Struct

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 04/03/2006 - 14:32h

Netwarrior, o primeiro campo antes da chave { é que contem a identificação da estrutura. No caso, 'registro', e depois da chave de "fechamento" }, possui a lista de variáveis, no caso, 'reg'...

Té mais,


8. Re: Struct - Ajuda

Bruno Tosta Abrahão
abrh.bruno

(usa Fedora)

Enviado em 01/09/2006 - 19:06h

_fpurge faz o mesmo que fflush?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts