problems with 'Multiple Definition of...' in files. The

Asked

Viewed 1,280 times

0

Hello, I am doing a program to study lists and I am having a problem with the definitions of functions, I tried to solve with my data structures teacher but I could not understand right, if anyone can help me, my code is this:

main:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include "menu.h"

//Programa principal
int main()
{
    setlocale(LC_CTYPE, "Portuguese");

    aloca_memoria_aeroporto(&cabAeroporto);

    int op;

    menu(&op);

    return 0;
}

menu. h:

#include "menu.c"

void Display_Menu();
void menu (int *op);

menu. c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "src\src.h"

//2 Constantes para controle do fluxo do programa, um para congelar a tela e outro para limpar
#define CLEAR "cls"
#define PAUSE "pause"


//Display do menu do sistema de controle aereo
void Display_Menu()
{
    system("cls");
    printf("            Menu            \n");
    printf("1- Cadastrar Aeroporto.\n");
    printf("2- Lista Aeroportos.\n");
    printf("3- Remove Aeroporto.\n");
    printf("4- Cadastrar Voo.\n");
    printf("5- Ver Voos do aeroporto.\n");
    printf("6- Ver Voos da companhia.\n");
    printf("7- Remove voo.\n");
    printf("8- Experimentar a viagem iterativa.\n");
    printf("0- Sair\n\n");
    printf("Escolha uma opcao:");

}

void menu (int *op)
{

    do{
        system(CLEAR);

        Display_Menu();

        scanf("%d",&*op);

        switch (*op){
            case 1:{
                cadastra_aeroporto(cabAeroporto);
                break;
            }
            case 2:{
                lista_aeroportos(cabAeroporto);
                break;
            }
            case 3:{
                remove_aeroportos(cabAeroporto);
                break;
            }
            case 4:{
                cadastra_voo(cabAeroporto);
                break;
            }
            case 5:{
                lista_voos_aeroporto(cabAeroporto);
                break;
            }
            case 6:{
                lista_voos_companhia(cabAeroporto);
                break;
            }
            case 7:{
                remove_voo(cabAeroporto);
                break;
            }
            case 8:{
                viagem_iterativa(cabAeroporto);
                break;
            }
        }

        system(PAUSE);

    }while(op != 0);
}

src. h:

#include "src.c"

_Aeroporto* cabAeroporto;

src. c:

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

//Constantes para controle do fluxo do programa, um para congelar a tela e outro para limpar
#define CLEAR "cls"
#define PAUSE "pause"

//Estrutura tipo voo
typedef struct _voo{
    char companhia [50];
    int numero;
    struct _aeroporto* destino;
    struct _voo* proximo;
    struct _voo* anterior;

} _Voo;

//Estrutura tipo aeroporto
typedef struct _aeroporto{
    char nome [50];
    struct _voo* voos;
    struct _aeroporto* proximo;
    struct _aeroporto* anterior;

} _Aeroporto;
/*essa parte de declaração de funções, meu professor pediu para por aqui
ao invez de por no header*/
void aloca_memoria_aeroporto(_Aeroporto** aeroporto);
void aloca_memoria_voo();
void ler_dados_aeroporto();
void cadastra_aeroporto();
void lista_aeroportos();
void imprime_aeroporto();
void remove_aeroportos();
void cadastra_voo();
void ler_dados_voo();
void lista_voos_aeroporto();
void imprime_voo();
void lista_voos_companhia();
void remove_voo();
void viagem_iterativa();


//Busca na lista de aeroportos algum aeroporto cujo nome seja igual ao recebido
_Aeroporto* busca_aeroporto(_Aeroporto* cabAeroporto, char nome_aeroporto[]){

    _Aeroporto* cursor;

    for(cursor = cabAeroporto->proximo ; cursor != NULL; cursor = cursor->proximo){
        if(strcmp(nome_aeroporto, cursor->nome) == 0){
            return cursor;
        }
  }
    return NULL;
}

//Recebe o nome do aeroporto de origem e de destino e verifica se existe algum voo parecido.
_Voo* busca_voo(_Aeroporto* cabAeroporto, char origem[], char destino[]){

    _Voo* voos;
    _Voo* voo_cursor;
    _Aeroporto* aeroporto;

    aeroporto = busca_aeroporto(cabAeroporto, origem);

    if(aeroporto){
        voos = aeroporto->voos;

        for(voo_cursor = voos->proximo ; voo_cursor != NULL; voo_cursor = voo_cursor->proximo){
            if(strcmp(destino, (voo_cursor->destino)->nome) == 0){
                return voo_cursor;
            }
        }
    }

    return NULL;
}

//Aloca memoria para um tipo _Aeroporto
void aloca_memoria_aeroporto(_Aeroporto** aeroporto){
    (*aeroporto) = (_Aeroporto*) malloc (sizeof(_Aeroporto));

    if ((*aeroporto) == NULL){
        printf("Falha na alocacao da memoria\n");
    }

    (*aeroporto)->proximo = NULL;
}

//Aloca memoria para um tipo _Voo
void aloca_memoria_voo(_Voo** voo){
    (*voo) = (_Voo*) malloc (sizeof(_Voo));

    if ((*voo) == NULL){
        printf("Falha na alocacao da memoria\n");
    }

    (*voo)->proximo = NULL;
}

//Cadastra aeroporto
void cadastra_aeroporto(_Aeroporto* cabAeroporto){
    _Aeroporto* aeroporto;
    _Aeroporto* cursor;

    // Obtem o endereco do cabeca
    cursor = cabAeroporto;

    // Aloca a memoria para um novo elemento
    aloca_memoria_aeroporto(&aeroporto);
    aloca_memoria_voo(&aeroporto->voos);

    // Le o dados a serem cadastrados
    ler_dados_aeroporto(aeroporto);

    if(busca_aeroporto(cabAeroporto, aeroporto->nome)){
        printf("Nome de aeroporto já registrado!\n");
    }

    // Navega ate o fim da lista
    while (cursor->proximo != NULL){
        cursor = cursor->proximo;
    }

    // Insere o novo elemento no fim da lista
    cursor->proximo = aeroporto;
    aeroporto->anterior = cursor;
}

//Faz a leitura de dados do aeroporto
void ler_dados_aeroporto(_Aeroporto* aeroporto){
    printf("Nome do aeroporto: ");
    scanf(" %[^\n]s", aeroporto->nome);
}

// Varre a lista de aeroportos e imprime-os
void lista_aeroportos(_Aeroporto* cabAeroporto){

    _Aeroporto* cursor;

    printf("Aeroportos da lista\n\n");

    for(cursor = cabAeroporto->proximo ; cursor != NULL; cursor = cursor->proximo){
        imprime_aeroporto(cursor);
    }
}

//Imprime os dados de um aeroporto
void imprime_aeroporto(_Aeroporto* cabAeroporto){
    printf("Nome do aeroporto: %s\n",cabAeroporto->nome);
}

//Remove um aeroporto da lista de aeroportos
void remove_aeroportos(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    char nome_aux[50];

    printf("Nome do aeroporto para ser removido: ");
    scanf(" %[^\n]s", nome_aux);

    aeroporto = busca_aeroporto(cabAeroporto, nome_aux);

    if(aeroporto){
        (aeroporto->anterior)->proximo = aeroporto->proximo;
         printf("Aeroporto remotivo com sucesso!\n\n");
    }else{
        printf("Nenhum aeroporto com este nome foi encontrado!\n\n");
    }
}

//Cadastra voo
void cadastra_voo(_Aeroporto* cabAeroporto){

    _Voo* voo;
    _Voo* cursor_voo;
    _Aeroporto* origem;
    _Aeroporto* destino;
    char nome_origem[50];
    char nome_destino[50];

    // Aloca a memoria para um novo elemento
    aloca_memoria_voo(&voo);

    // Le o dados a serem cadastrados
    ler_dados_voo(voo);

    printf("Nome da origem: ");
    scanf(" %[^\n]s", nome_origem);

    origem = busca_aeroporto(cabAeroporto, nome_origem);

    if(origem){
        cursor_voo = origem->voos;
    }else{
        printf("Nenhum aeroporto com este nome foi encontrado!\n\n");
    }

    printf("Nome do destino: ");
    scanf(" %[^\n]s", nome_destino);

    if(busca_voo(cabAeroporto, nome_origem ,nome_destino)){
        printf("Voo j� programado!\n");
    }

    destino = busca_aeroporto(cabAeroporto, nome_destino);

    if(destino){
        voo->destino = destino;
    }else{
        printf("Nenhum aeroporto com este nome foi encontrado!\n\n");
    }

    while (cursor_voo->proximo != NULL){
        cursor_voo = cursor_voo->proximo;
    }

    // Insere o novo elemento no fim da lista
    cursor_voo->proximo = voo;
    voo->anterior = cursor_voo;

    printf("Voo adicionado com sucesso!\n\n");
}

//Coleta os dadados do voo vindos do usu�rio
void ler_dados_voo(_Voo* voo){
    printf("N�mero do voo: ");
    scanf("%d", &voo->numero);

    printf("Nome da companhia a�rea: ");
    scanf(" %[^\n]s", voo->companhia);
}

//Lista todos os voos que saem de um determinado aeroporto
void lista_voos_aeroporto(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    _Voo* voos;
    _Voo* voo_cursor;
    char nome_aux[50];

    printf("Nome do aeroporto: ");
    scanf(" %[^\n]s", nome_aux);

    aeroporto = busca_aeroporto(cabAeroporto, nome_aux);

    if(aeroporto){

        voos = aeroporto->voos;

        for(voo_cursor = voos->proximo ; voo_cursor != NULL; voo_cursor = voo_cursor->proximo){
            imprime_voo(voo_cursor);
        }

    }else{
        printf("Aeroporto n�o encontrado!\n");
    }
}

//Imprime na tela os dados de um voo
void imprime_voo(_Voo* voo){
    printf("N�mero do voo: %d\n",voo->numero);
    printf("Nome da companhia: %s\n",voo->companhia);
    printf("Aeroporto de destino: %s\n",(voo->destino)->nome);
}

//Lista todos os voos que saem de um determinado companhia aerea
void lista_voos_companhia(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    _Voo* voo_cursor;
    char nome_aux[50];

    aeroporto = cabAeroporto;

    printf("Nome da companhia: ");
    scanf(" %[^\n]s", nome_aux);

    while (aeroporto->proximo != NULL){

        aeroporto = aeroporto->proximo;
        voo_cursor = aeroporto->voos;

        while (voo_cursor->proximo != NULL){
            voo_cursor = voo_cursor->proximo;

            if(strcmp(nome_aux, voo_cursor->companhia) == 0){
                printf("De %s para %s:\n",aeroporto->nome, (voo_cursor->destino)->nome);
            }
        }
    }
}

//Remove voo de uma lista de voos
void remove_voo(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    _Voo* voo_cursor;
    char nome_origem[50];
    char nome_destino[50];

    aeroporto = cabAeroporto;

    printf("Nome do aeroporto de origem: ");
    scanf(" %[^\n]s", nome_origem);

    aeroporto = busca_aeroporto(cabAeroporto, nome_origem);

    if(aeroporto){

        printf("Nome do aeroporto de destino: ");
        scanf(" %[^\n]s", nome_destino);

        voo_cursor = aeroporto->voos;

        while (voo_cursor->proximo != NULL){
            voo_cursor = voo_cursor->proximo;

            if(strcmp(nome_destino, (voo_cursor->destino)->nome) == 0){
                (voo_cursor->anterior)->proximo = voo_cursor->proximo;
                printf("Aeroporto remotivo com sucesso!\n\n");
            }
        }
    }else{
        printf("Aeroporto n�o encontrado!\n");
    }
}

//Faz uma viagem iterativa com o usu�rio
void viagem_iterativa(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    _Voo* voo_inicial = NULL;
    _Voo* voo_cursor = NULL;
    int op, aux;

    aeroporto = cabAeroporto;

    if(aeroporto->proximo == NULL){
        printf("N�o existe aeroportos cadastrados!\n");
    }

    while (aeroporto->proximo != NULL){

        aeroporto = aeroporto->proximo;

        if((aeroporto->voos)->proximo != NULL){
            voo_inicial = aeroporto->voos;
            break;
        }
    }

    if(voo_inicial == NULL){
        printf("Nenhum voo cadastrado!\n");
    }

    do{
        voo_cursor = voo_inicial;
        aux = 0;
        system(CLEAR);

        printf("            Voos do aeroporto %s!            \n", aeroporto->nome);

        while (voo_cursor->proximo != NULL){
            voo_cursor = voo_cursor->proximo;
            imprime_voo(voo_cursor);
            printf("\n");
        }

        printf("\n0- Sair\n\n");
        printf("Escolha um voo:");

        scanf("%d",&op);

        voo_cursor = voo_inicial;

        if(op != 0){
            while (voo_cursor->proximo != NULL){
                voo_cursor = voo_cursor->proximo;
                if(voo_cursor->numero == op){
                    voo_inicial = (voo_cursor->destino)->voos;
                    aeroporto = voo_cursor->destino;
                    aux++;
                }
            }

            if(aux == 0){
                printf("Número de voo incorreto!\n");
                system(PAUSE);
            }
        }

    }while(op != 0);

}

the mistakes that are giving are in this photo:

imagem_do_error

1 answer

1


Do not include files with extension . c!

Puts the definition of structures in files . h (a struct _voo and the struct _aeroporto).

Put function prototypes in files . h.

Puts the include Guards in your files . h.

  • I’m still with the same mistake né y'' my god I’ll solve it today @pmg I promise

  • but how will I find what has in src. c for example, if src. h does not call src. c

  • 1

    Part of the compilation is called linkage (or mixing). This part takes the result of compiling different files . c and mixes them to get a result where everything is available. Recent compilers hide a lot of this process by doing everything automatically. Which system do you use to write code, compile, and debug?

  • Windows 8.1 gnu+gcc IDE Falcon c/c++ the same ones that I informed him in another recent question, in fact I still did not intend very well how to do, the theoretical part I intended well. I just don’t know what to do (meaning how the mistake happens)

  • I don’t know Falcon, but looking at the image, I think you’ll need to change the menu files. h, main. c, and menu. c to the src folder. Then F9 ...

  • not because when I call src. h and . c I call them directly in the folder

  • 1

    Tomorrow I try this Falcon with your code at work. Here at home I only have Unix; can not install.

  • have you tried using sublime text? I think it doesn’t differ much

  • 1

    Checks in the my github. I keep changing the files little by little, you’re watching the changes :)

  • 1

    Already compiles and runs (with errors) on my Falcon ... http://snag.gy/l11nO.jpg

  • actually(rewriting the comment), in my compilation with a lot of error in .O como main.o, menu.o e src.o but it doesn’t run

  • my teacher told me not to use include guard For the time being, I haven’t talked about it in class yet, but you assured me it’s a way to solve yes, I’ll even take a closer look at that subject to further understand. about the solution of the problem I will do only with a header only because this giving much problem to do without include Guard. thanks pmg =)

Show 8 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.