Struct em gcc [RESOLVIDO]

1. Struct em gcc [RESOLVIDO]

Jean Francisco Cavalcante
cavalcantejean

(usa Ubuntu)

Enviado em 31/03/2013 - 17:19h

Olá pessoal, estou tentando compilar um código de struct em C pelo gcc


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <ctype.h>

struct fila
{
int inicio;
int fim;
int contador;
char nome[5][10];
};
int enqueue (fila &f, char texto[10])
{
if (f.contador==5) return 0;
strcpy(f.nome[f.fim],texto);
f.fim++; f.contador++;
if (f.fim==5) f.fim=0;
return 1;
}
int dequeue (fila &f)
{
if (f.contador==0) return 0;
f.inicio++; f.contador--;
if (f.inicio==5) f.inicio=0;
return 1;
}
int busca (fila f, char texto[50])
{
strcpy(texto, f.nome [f.inicio]);
return 1;
}

int main ()
{
fila f;
f.fim = 0;
f.inicio = 0;
f.contador =0;
int cont=0,i,j,elem,aux;
char nome1[20];
char opcao;

while (cont==0)
{
printf("\nOque quer fazer a-Inserir b-Retirar s-sair");
printf("\n--> "); scanf("%s",&opcao);
opcao=toupper(opcao);


switch(opcao)
{
case 'A':
{
printf ("Digite um nome (%d): \n",f.fim);
scanf("%s",nome1);
aux=enqueue(f,nome1);
if (aux==0) printf("\nFila Cheia");
else printf("\nElemento inserido.A fila contem %d elementos\n",f.contador);
break;
}
case 'B':
{
aux=dequeue(f);
if (aux==0) printf("\nFila Vazia");
else printf("\nElemento retirado. A fila contem %d elementos\n",f.contador);
break;
}
case 'S':
{
printf("\nSaindo...\n"); system("Pause");
cont=1;
}
default:
printf("\nO caracter recem digitado e uma opcao invalida\n");
break;

}

}}


quando a segunte mensagem de erro aparece:

.c:4:19: fatal error: conio.h: Arquivo ou diretório não encontrado
compilação terminada.



  


2. Re: Struct em gcc [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 31/03/2013 - 17:28h

GCC segue C ANSI.

conio.h não existe nesse padrão.

Tem que usar outros truques ou procurar uma implementação de alguém.


3. Re: Struct em gcc [RESOLVIDO]

Jean Francisco Cavalcante
cavalcantejean

(usa Ubuntu)

Enviado em 31/03/2013 - 17:49h

Procurei reduzir ao máximo possível:


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

struct fila
{
int inicio;
int fim;
int contador;
char nome[5][10];
};
int enqueue (fila &f, char texto[10])
{
if (f.contador==5) return 0;
strcpy(f.nome[f.fim],texto);
f.fim++; f.contador++;
if (f.fim==5) f.fim=0;
return 1;
}
int dequeue (fila &f)
{
if (f.contador==0) return 0;
f.inicio++; f.contador--;
if (f.inicio==5) f.inicio=0;
return 1;
}
int busca (fila f, char texto[50])
{
strcpy(texto, f.nome [f.inicio]);
return 1;
}

int main ()
{
fila f;
f.fim = 0;
f.inicio = 0;
f.contador =0;
int cont=0,i,j,elem,aux;
char nome1[20];
char opcao;

while (cont==0)
{
printf("\nOque quer fazer a-Inserir b-Retirar s-sair");
printf("\n--> "); scanf("%s",&opcao);


switch(opcao)
{
case 'A':
{
printf ("Digite um nome (%d): \n",f.fim);
scanf("%s",nome1);
aux=enqueue(f,nome1);
if (aux==0) printf("\nFila Cheia");
else printf("\nElemento inserido.A fila contem %d elementos\n",f.contador);
break;
}
case 'B':
{
aux=dequeue(f);
if (aux==0) printf("\nFila Vazia");
else printf("\nElemento retirado. A fila contem %d elementos\n",f.contador);
break;
}
case 'S':
{
printf("\nSaindo...\n");
cont=1;
}
default:
printf("\nO caracter recem digitado e uma opcao invalida\n");
break;

}

}
return 0;
}



Porém, ele não reconhece o struct porque mostrou essa mensagem:

fila-circular.c:12:19: error: expected ‘)’ before ‘&’ token
fila-circular.c:20:19: error: expected ‘)’ before ‘&’ token
fila-circular.c:27:12: error: unknown type name ‘fila’
fila-circular.c: Na função ‘main’:
fila-circular.c:35:1: error: unknown type name ‘fila’
fila-circular.c:36:2: error: request for member ‘fim’ in something not a structure or union
fila-circular.c:37:2: error: request for member ‘inicio’ in something not a structure or union
fila-circular.c:38:2: error: request for member ‘contador’ in something not a structure or union
fila-circular.c:53:39: error: request for member ‘fim’ in something not a structure or union
fila-circular.c:57:68: error: request for member ‘contador’ in something not a structure or union
fila-circular.c:64:70: error: request for member ‘contador’ in something not a structure or union

Ja tentei deixar assim:

struct <my_struct>
{
...
} my_struct;

Porém, continua não reconhecendo do mesmo jeito


4. Re: Struct em gcc [RESOLVIDO]

Reginaldo de Matias
saitam

(usa Slackware)

Enviado em 31/03/2013 - 18:19h

sintaxe struct esta errada.

o correto seria
struct NOME-ESTRUTURA{
tipo variáveis;
...;
...;
}NOME-ESTRUTURA;


Faltou o que esta em negrito.

Veja o exemplo abaixo:

#include <stdio.h>
struct ponto{
int a;
int b;
}ponto;

int main()
{

ponto.a = 1;
ponto.b = 2;
printf("P(%i,%i)\n",ponto.a,ponto.b);
return 0;
}


$gcc teste-struct.c -o teste-struct
$./teste-struct
P(1,2)




5. Re: Struct em gcc [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 31/03/2013 - 18:28h

struct fila {
int inicio;
int fim;
int contador;
char nome[5][10];
};

(...)

fila f; // <--


O problema está na declaração da variável:

struct fila f; 


Sempre tem que usar struct.

Você pode misturar struct com typedef se quiser não usar a palavra struct na declaração:

typedef struct fila {
int inicio;
int fim;
int contador;
char nome[5][10];
} Tipo_Fila;

(...)

Tipo_Fila f;





6. Re: Struct em gcc [RESOLVIDO]

Eduardo Antonio
hatosco

(usa Outra)

Enviado em 31/03/2013 - 18:29h

Eu acho q esse erro esta dando pois C não tem suporte a parametro passado por referencia como em int enqueue (fila &f, char texto[10]) e em int dequeue (fila &f) . Ou voce compila com o g++ ou utiliza as formas padroes do C: valor ou referencia(ponteiro). Espero ter ajudado!


7. Re: Struct em gcc [RESOLVIDO]

Jean Francisco Cavalcante
cavalcantejean

(usa Ubuntu)

Enviado em 31/03/2013 - 18:47h

Eu deixei assim:


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

typedef struct fila
{
int inicio;
int fim;
int contador;
char nome[5][10];
} fila ;

fila f;

int enqueue (fila &f, char texto[10])
{
if (f.contador==5) return 0;
strcpy(f.nome[f.fim],texto);
f.fim++; f.contador++;
if (f.fim==5) f.fim=0;
return 1;
}
int dequeue (fila &f)
{
if (f.contador==0) return 0;
f.inicio++; f.contador--;
if (f.inicio==5) f.inicio=0;
return 1;
}...


Tentei compilar pelo g++, mas também continua dando erro, e no gcc aparece:

fila-circular.c:15:19: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
fila-circular.c:23:19: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token

E é bem naquela parte do fila &f


8. Re: Struct em gcc [RESOLVIDO]

Eduardo Antonio
hatosco

(usa Outra)

Enviado em 31/03/2013 - 19:15h

Entao, como eu tinha dito, vc tem q mudar o tipo de chamada. Uma forma é remover o '&' ou transformar os valores recebidos em ponteiros. Mas nesse caso, onde os valores dos argumentos sao alterados a unica maneira é utilizar ponteiros: int enqueue (fila* f, char texto[10]) e em int dequeue (fila* f), fora as alterações no resto do codigo para receber essa alteração, como substituir o . por -> ...


9. Re: Struct em gcc [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 31/03/2013 - 19:41h

hatosco escreveu:

Entao, como eu tinha dito, vc tem q mudar o tipo de chamada. Uma forma é remover o '&' ou transformar os valores recebidos em ponteiros. Mas nesse caso, onde os valores dos argumentos sao alterados a unica maneira é utilizar ponteiros: int enqueue (fila* f, char texto[10]) e em int dequeue (fila* f), fora as alterações no resto do codigo para receber essa alteração, como substituir o . por -> ...


Isso confunde porque certas IDEs fazem a pessoa trabalhar com C++ sem perceber se ela não estiver atenta.

No caso, o que se faz é declarar uma função que receba um ponteiro:

void minha_funcao (fila *f){ ... ] 


E quando for usá-la no corpo do programa:

fila f;
minha_funcao (&f);


Mas e se f não é do tipo fila e sim um ponteiro?

fila *f;
minha_funcao (f);


Não precisa do & porque essa variável já é o que a função deseja.

Sobre a forma de declaração

typedef struct fila { ... } fila 


Eu havia lido que não é bom deixar o nome do tipo exatamente igual ao da estrutura, apesar de ser possível.

typedef struct { ... } fila 


Omitir o nome da struct também é possível, mas também não é recomendado.

O que nessa referência vi ser o recomendado era:

typedef struct fila { ... } Fila 


Algo como o nome da struct ser o nome do tipo com inicial maiúscula.

Isso parece ser um padrão ou uma convenção, só não sei de onde saiu isso.

Apesar de não seguir muito esse tipo de padrão, não sei de onde esse é ou não me recordo.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts