Logo Hardware.com.br
palominha
palominha Membro Senior Registrado
246 Mensagens 0 Curtidas

Erro de compilação

#1 Por palominha 05/04/2006 - 13:27
Tá dando esses dois erros e ñ sei pq alguém pode me dar uma ajuda?

- `WinMain@16'
- ld returned 1 exit status

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

typedef struct edificio{
char nome[51];
int hora;
int min;
struct edificio *prox;
}edf;

char nome[51];
int hora;
int min;
edf *lista;

//FUNÇÃO AUXILIAR
void cadastro()
{
printf ("Entre com o nome: &quot;
fgets (nome,51,stdin);

printf ("Entre com a hora: &quot;
scanf ("%d", &hora);

printf ("Entre com os minutos: &quot;
scanf ("%d", &min);
}

//FUNÇÃO INCLUIR
void incluir()
{
edf *ptr;
void cadastro();
ptr = (edf*)calloc(1,sizeof(edf));
strcpy(ptr -> nome, nome);
ptr -> hora = hora;
ptr -> min = min;
ptr -> prox = NULL;

if (lista == NULL)
{
lista = ptr;
}
else
{
ptr -> prox = lista;
lista = ptr;
}
}

//FUNÇÃO LISTA VAZIA
edf* vazia(void)
{
return NULL;
}



peczenyj
peczenyj Geek Registrado
3K Mensagens 75 Curtidas
#2 Por peczenyj
05/04/2006 - 15:45
Humm sera que é por que não tem main() ?

Se não tem main, ou vc só gera o .o (object) para juntar com outro código que tenha main, ou coloca - de fato - um main.

void cadastro();

int main (void) {

cadastro();

return 0;
}


depois

gcc -Wall -c arquivo.c // gera o '.o' com o codigo acima
gcc -Wall main.c arquivo.o

Acho que tu vais ter problema com as variaveis globais definidas no teu código, pensa um pouco... ;-)
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#6 Por jackinabox
05/04/2006 - 19:40
palominha
mas pq terei problemas com as variáveis globais?

Variáveis globais devem ser evitadas sempre que possível, pois geram um nível altamente indesejável de acoplamento. Com muita freqüência, o uso indiscriminado de variáveis globais indica software de baixa qualidade. Pode servir para fazer protótipos rápidos, programas pequenos e auto-contidos e coisas desse tipo, mas só isso. Em algumas linguagens (como Java, por exemplo), não existem variáveis globais.
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
palominha
palominha Membro Senior Registrado
246 Mensagens 0 Curtidas
#7 Por palominha
06/04/2006 - 10:04
Gente o programa compila, mas o resultado ñ é o esperado, acho que é algum erro no loop, alguém pode dar uma olhada :roll:

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

typedef struct edificio{
char nome[51];
int hora;
int min;
struct edificio *prox;
}edf;

//VARIÁVEIS GLOBAIS
char nome[51];
int hora, min;
edf *lista;

//FUNÇÃO AUXILIAR
void cadastro ()
{
printf ("Entre com o nome: &quot;
fgets (nome,51,stdin);
printf ("\n&quot;

printf ("Entte com a hora: &quot;
scanf ("%d",&hora);

printf ("Entre com os minutos: &quot;
scanf ("%d", &min);
printf ("\n&quot;
}

//FUNÇÃO INCLUIR
void incluir ()
{
edf *ptr;

cadastro ();

ptr = (edf*)calloc(1,sizeof(edf));
strcpy(ptr -> nome, nome);
ptr -> hora = hora;
ptr -> min = min;
ptr -> prox= NULL;

if (lista == NULL)
{
lista = ptr;
}
else
{
ptr -> prox = lista;
lista = ptr;
}
}

//FUNÇÃO CRIA LISTA VAZIA
edf* vazia(void)
{
return NULL;
}

//FUNÇÃO EXCLUIR
void excluir()
{
edf *aux1;
edf *aux2;

cadastro();

aux2 = NULL;
aux1 = lista;

while ((aux1!= NULL) && (aux1 -> nome != nome) || (aux1 -> hora !=
hora) || (aux1 -> min != min))
{
aux2 = aux1;
aux1 = aux1 -> prox;
}

if (aux2 == NULL)
{
lista = aux1 -> prox;
}

else
{
aux2 -> prox = aux1 -> prox;
}

free (aux1);

printf ("O nome foi excluido \n&quot;
}

//FUNÇÃO LISTAR
void listar()
{
edf *aux;

aux = lista;

while (aux != NULL)

{
printf ("Nome: %s", aux -> nome);
printf ("Horas: %d", aux -> hora);
printf ("Minutos: %d", aux -> min);

aux = aux -> prox;
}
}

//FUNÇÃO PRINCIPAL
int main()
{
char op;

do{
printf ("(I)ncluir\n&quot;
printf ("(E)xcluir\n&quot;
printf ("(L)istar\n&quot;
printf ("(S)air\n&quot;
printf ("\n&quot;
printf("Digite a opcao: &quot;

op = toupper (getchar());

switch (op)
{
case 'I': incluir ();
break;

case 'E': excluir ();
break;

case 'L': listar ();
break;
}

system ("PAUSE&quot;

}while(op != 'S';

return (0);
}





jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#8 Por jackinabox
06/04/2006 - 12:53
Escrevi minha versão na hora do almoço, para você dar uma olhada.
Mudei algumas coisas no programa, como nomenclatura (tenho dificuldade para programar se a nomenclatura não estiver OK) e formatação, e retirei as famigeradas variáveis globais.

Tive que colocar vários fflush(stdin), pois no meu sistema os newline estavam ficando no buffer.

Não escrevi a função "excluir", deixei como exercício para você.


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

typedef struct Edificio
{
char nome[51];
int hora;
int min;
struct Edificio *prox;
} TEdificio;

//FUNÇÃO INCLUIR
TEdificio * incluir(TEdificio *lista)
{
TEdificio *edificio;
char nome[51];
int hora;
int min;

printf("Entre com o nome: &quot;
fflush(stdin);
fgets(nome, 51, stdin);
nome[strlen(nome) - 1] = '\0';

printf("Entre com a hora: &quot;
fflush(stdin);
scanf("%d", &hora);

printf("Entre com os minutos: &quot;
fflush(stdin);
scanf("%d", &min);

edificio = (TEdificio *)malloc(sizeof(TEdificio));
strcpy(edificio->nome, nome);
edificio->hora = hora;
edificio->min = min;

edificio->prox = lista;
lista = edificio;
return lista;
}


//FUNÇÃO LISTAR
void listar(TEdificio *lista)
{
TEdificio *ptr;
if(lista == NULL)
{
printf("\nLista vazia\n&quot;
return;
}

ptr = lista;
do
{
printf("\n\nNome: %s", ptr->nome);
printf("\nHoras: %d", ptr->hora);
printf("\nMinutos: %d", ptr->min);
} while((ptr = ptr->prox) != NULL);
printf("\n&quot;
}

//FUNÇÃO PRINCIPAL
int main()
{
TEdificio *lista = NULL;

char op;
do
{
printf("\n(I)ncluir&quot;
printf("\n(E)xcluir&quot;
printf("\n(L)istar&quot;
printf("\n(S)air&quot;
printf("\n\nDigite a opcao: &quot;

fflush(stdin);
op = toupper(getchar());
switch(op)
{
case 'I':
lista = incluir(lista);
break;
case 'E':
/*lista = excluir(lista); */
break;
case 'L':
listar(lista);
break;
}
} while(op != 'S';
return 0;
}
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#10 Por jackinabox
06/04/2006 - 21:21
palominha
Pq vc colocou fflush eu já havia colocado.

Já havia colocado :?: Onde :?:

Se ñ for pedir muito vc poderia falar dessas alterações que vc fez


Vamos lá, vou comentar algumas:

1. Mudei o nome do tipo definido pelo typedef para TEdificio (como eu já havia sugerido em outro tópico, lembra?):

typedef struct Edificio
{
char nome[51];
int hora;
int min;
struct Edificio *prox;
} TEdificio;


2. Em vez de usar variáveis globais, a lista é passada como parâmetro. Como a função incluir() altera a lista, ela então passa a retornar um ponteiro para a lista, em vez de void:

TEdificio * incluir(TEdificio *lista)


3. Removi a função cadastro() apenas para simplificar um pouco, pois escrevi o código rapidamente, e removi a função vazia(), pois não estava sendo usada e também não me parece fazer muito sentido. Mesmo que fosse utilizada, "vazia()" não parece um bom nome para uma função que cria uma lista, parece?
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
palominha
palominha Membro Senior Registrado
246 Mensagens 0 Curtidas
#11 Por palominha
07/04/2006 - 23:21
Pessoal o programa compila, mas em certo momento exibe uma caixa de texto "O main encontrou um erro e precisa ser fechado".

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

typedef struct edificio{
char nome[51];
int hora;
int min;
struct edificio *prox;
}edf;

//VARIÁVEIS GLOBAIS
char nome[51];
int hora, min;
edf *lista;

//FUNÇÃO AUXILIAR
void cadastro ()
{
printf ("Entre com o nome: &quot;
fgets (nome,51,stdin);
fflush(stdin);

printf ("Entre com a hora: &quot;
scanf ("%d",&hora);
fflush(stdin);

printf ("Entre com os minutos: &quot;
scanf ("%d", &min);
fflush(stdin);
printf ("\n&quot;
}

//FUNÇÃO INCLUIR
void incluir ()
{
edf *ptr;

cadastro ();

ptr = (edf*)calloc(1,sizeof(edf));
strcpy(ptr -> nome, nome);
ptr -> hora = hora;
ptr -> min = min;
ptr -> prox= NULL;

if (lista == NULL)
{
lista = ptr;
}
else
{
ptr -> prox = lista;
lista = ptr;
}
}

//FUNÇÃO CRIA LISTA VAZIA
edf* vazia(void)
{
return NULL;
}

//FUNÇÃO EXCLUIR
void excluir()
{
edf *aux1;
edf *aux2;

cadastro();

aux2 = NULL;
aux1 = lista;

while ((aux1!= NULL) && (aux1 -> nome != nome) || (aux1 -> hora != hora) || (aux1 -> min != min))
{
aux2 = aux1;
aux1 = aux1 -> prox;
}

if (aux2 == NULL)
{
lista = aux1 -> prox;
}

else
{
aux2 -> prox = aux1 -> prox;
}

free (aux1);

printf ("O nome foi excluido \n&quot;
}

//FUNÇÃO LISTAR
void listar()
{
edf *aux;

aux = lista;

while (aux != NULL)

{
printf ("Nome: %s", aux -> nome);
printf ("Horas: %d\n", aux -> hora);
printf ("Minutos: %d\n\n", aux -> min);

aux = aux -> prox;
}
}

//FUNÇÃO PRINCIPAL
int main()
{
char op;

lista = vazia();

do{
system("cls&quot;
printf ("(I)ncluir\n&quot;
printf ("(E)xcluir\n&quot;
printf ("(L)istar\n&quot;
printf ("(S)air\n&quot;
printf ("\n&quot;
printf("Digite a opcao: &quot;

op = toupper (getche());

printf ("\n&quot;

switch (op)
{
case 'I': incluir ();
break;

case 'E': excluir ();
break;

case 'L': listar ();
break;
}

system ("PAUSE&quot;

}while(op != 'S';

return (0);
}







jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#12 Por jackinabox
08/04/2006 - 10:46
palominha, tenho a impressão de que você está preocupada apenas em fazer o programa compilar e executar. Se você quer optar por ignorar algumas das sugestões e explicações que estamos dando, tudo bem. Mas pelo menos tente entender o programa do jeito que você o escreveu. Seria bom que você tentasse utilizar um debugger para verificar, passo a passo, o que está ocorrendo, a cada execução de cada função, verificando principalmente se os ponteiros estão apontando para onde deveriam.

Você deve também considerar situações específicas, como:

- listar uma lista vazia
- listar uma lista com apenas um elemento
- excluir o último elemento da lista
- etc.

palominha
em certo momento exibe uma caixa de texto

Em qual momento :?: Quando você escolhe qual opção do menu :?:
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
palominha
palominha Membro Senior Registrado
246 Mensagens 0 Curtidas
#13 Por palominha
08/04/2006 - 14:01
Não que eu ñ dê atenção as sugestões e também ñ estou só preocupada em compilar o programa, mas quero que compile afinal é um trabalho pra faculdade que vale nota :wink: . Eu preferi deixar o programa da forma que fiz pq achei melhor, pra ñ me enrolar mais. Estou fazendo um outro de lista e estou seguindo suas sugestões, concordo que usar variáveis globais ñ é legal, e até já lí que é recomendável evitar seu uso, e também o programa fica mais simples. Agradeço sua ajuda e espero que continue me dando uma força.

E quanto a mensagem de erro, acho que é alguma coisa na função excluir, pq é quando ela aparece oops.png
Rui_Carlos
Rui_Carlos Veterano Registrado
1.3K Mensagens 17 Curtidas
#14 Por Rui_Carlos
08/04/2006 - 17:47
jackinabox, você acrescentou o 'fflush(stdin)' em vários pontos do programa. num livro de C que eu tenho diz lá que isso serve para limpar o buffer do stdin. no entanto eu já tentei fazer isso e não dava resultado (em Linux).

de acordo com o que eu entendi lendo as páginas de man do gcc (Mac), o efeito de realizar uma operação do tipo 'fflush(file)' é obrigar a informação que é armazenada temporariamente num buffer a ser efectivamente escrita no em disco no ficheiro associado a 'file', não é propriamente limpar o conteúdo de 'file'...

aliás em Mac OS X (e se calhar em Linux também, nunca verifiquei) temos a função fpurge cujo efeito é precisamente apagar o buffer.

será que o problema são os SO's em que estamos a trabalhar?
qual o SO que você está usando?
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#15 Por jackinabox
08/04/2006 - 18:56
palominha
Não que eu ñ dê atenção as sugestões e também ñ estou só preocupada em compilar o programa

Sem problema, foi só um warning :wink: Mas você REALMENTE DEVERIA utilizar um debugger, daí você veria que o erro ao qual você se referiu está ocorrendo na linha do while a seguir. Se não for assim, com trabalhos mais complexos você vai ficar o resto da vida procurando os erros.


E quanto a mensagem de erro, acho que é alguma coisa na função excluir, pq é quando ela aparece

Hummm.... Olhando assim por alto, acho que o código da função excluir() está bem enrolado. Mas vamos "pinçar" alguns trechos...
Dê uma olhada nesse while, por exemplo:

while ((aux1!= NULL) && (aux1 -> nome != nome) || (aux1 -> hora != hora) || (aux1 -> min != min))


Veja só: a condição de permanência no while combina um && com uma cadeia de ||. Há vários parênteses desnecessários, mas onde é necessário não tem: pela precedência de operadores, o && tem precedência sobre o ||, então a primeira parte que será avaliada é


aux1 != NULL && aux1->nome != nome


e depois será avaliado o resto:

<resultado do AND> || aux1 -> hora != hora || aux1 -> min != min


ou seja, do jeito que está, se aux1 == NULL, o compilador continuará avaliando a expressão, e você estará dereferenciando um ponteiro NULL, e obviamente o programa vai abortar:


NULL->hora != hora


E veja só isso:

aux1->nome != nome


Você não pode comparar duas strings utilizando == ou !=, você deve utilizar strcmp().

Outra coisa: como você está lendo as strings com fgets(), deve tomar cuidando, pois essa função não descarta o newline. Talvez isso não tenha problema nesse programa, mas é importante notar que se eu digitar "EDIFICIO RIO DOS TIGRES", o buffer irá conter "EDIFICIO RIO DOS TIGRES\n".
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal