Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erros diversos de 'redefinição' e 'conflitos' ao se utilizar arquivos diversos .c e .h

Considerando os seguintes arquivos:

mapa.h

//HEADER DAS FUNÇÕES RELACIONADAS AO MAPA**************************************

struct mapa{
    char** matriz; 
    int linhas;
    int colunas;
};
typedef struct mapa MAPA;

void liberamapa(MAPA* m);
void lemapa(MAPA* m);
void alocamapa(MAPA* m);
void imprimemapa(MAPA* m);

fogefoge.h

//HEADER DEMAIS FUNÇÕES DO JOGO*************************************************

int acabou();
void move(char direcao);

mapa.c

#include<stdio.h>
#include<stdlib.h>
#include "mapa.h"
// #include "fogefoge.c"
// #include "fogefoge.h"

int i,j;

void liberamapa(MAPA* m){
    
   for(i=0;i<m->linhas;i++){
          free(m->matriz[i]);
    }
    
    free(m->matriz);
    
}

void alocamapa(MAPA* m){
    
    m->matriz = (char**)malloc(sizeof(char*) * m->linhas);
    
    for(i=0;i< m->linhas;i++){
        m->matriz[i] = (char*)malloc(sizeof(char) * (m->colunas + 1));
    }
    
}

void lemapa(MAPA* m){
// Abre o arquivo***************************************************************	
    FILE* f;
    f = fopen("mapa.txt", "r");
// Informa se tiver erro na leitura*********************************************    
    if(f==0){
        printf("Erro na leitura do mapa\n");
        exit(1); 
    }
// Lê a quantidade de linhas****************************************************   
    fscanf(f,"%d %d", &(m->linhas), &(m->colunas));
// Aloca o tamanho do array*****************************************************
    alocamapa(m);
// Lê as várias linhas**********************************************************
    for(i=0;i<m->linhas;i++){
        fscanf(f,"%s", m->matriz[i]); 
    }
    fclose(f);
}

void imprimemapa(MAPA* m){
    for(i=0;i<m->linhas;i++){
        printf("%s\n", m->matriz[i]);
    }
}

mapa.txt

5 10
|--------|
|...|..-.|
|..-|.@..|
|......-.|
|--------|

fogefoge.c

#include<stdio.h>
#include<stdlib.h>
#include "fogefoge.h"
#include "mapa.h"
#include "mapa.c"

MAPA m;
int i,j;

int acabou(){
    return 0;
}

void move(char direcao){
    int x;
    int y;
    //Acha a posicao do foge foge***********************************************
    for (i=0;i<m.linhas;i++){
        for (j=0;j<m.colunas;j++){
            if(m.matriz[i][j]=='@'){
                x=i;
                y=j;
                break;
            }
        }
    }
    
    switch(direcao){
        case 'a':
            m.matriz[x][y-1]='@';
            break;
        case 'w':
            m.matriz[x-1][y]='@';
            break;
        case 's':
            m.matriz[x+1][y]='@';
            break;
        case 'd':
            m.matriz[x][y+1]='@';
            break;
    }
    //Libera a posição anterior do foge foge************************************
    m.matriz[x][y] = '.' ;
}

int main(){
    
    lemapa(&m);
    
    do {
        
    imprimemapa(&m);
    
    char comando;
    scanf(" %c", &comando);
    
    move(comando);
        
    } while (!acabou());
    
    liberamapa(&m);
    
    return 0;
}

Ao compilar estou recebendo os seguintes erros Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como posso resolvê-los ?

1 resposta
solução!

Olá Lorena, tudo ben?

Os erros que você está encontrando são causados por múltiplas inclusões dos mesmos arquivos e definições no seu código. Vamos resolver isso passo a passo:

  1. Não inclua arquivos .c em outros arquivos .c:

    • Você não deve incluir mapa.c dentro de fogefoge.c. Em vez disso, compile ambos os arquivos separadamente e depois linke-os juntos na fase de linkagem do seu processo de compilação.
  2. Proteção contra múltiplas inclusões:

    • Adicione guardas de inclusão nos seus arquivos .h para evitar redefinições. Isso garante que o conteúdo do arquivo de cabeçalho seja incluído apenas uma vez.

Vamos corrigir os arquivos com base nisso:

mapa.h

#ifndef MAPA_H
#define MAPA_H

//HEADER DAS FUNÇÕES RELACIONADAS AO MAPA**************************************

struct mapa {
    char** matriz;
    int linhas;
    int colunas;
};
typedef struct mapa MAPA;

void liberamapa(MAPA* m);
void lemapa(MAPA* m);
void alocamapa(MAPA* m);
void imprimemapa(MAPA* m);

#endif // MAPA_H

fogefoge.h

#ifndef FOGEFOGE_H
#define FOGEFOGE_H

//HEADER DEMAIS FUNÇÕES DO JOGO*************************************************

int acabou();
void move(char direcao);

#endif // FOGEFOGE_H

mapa.c

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

int i, j;

void liberamapa(MAPA* m) {
    for (i = 0; i < m->linhas; i++) {
        free(m->matriz[i]);
    }
    free(m->matriz);
}

void alocamapa(MAPA* m) {
    m->matriz = (char**)malloc(sizeof(char*) * m->linhas);
    for (i = 0; i < m->linhas; i++) {
        m->matriz[i] = (char*)malloc(sizeof(char) * (m->colunas + 1));
    }
}

void lemapa(MAPA* m) {
    FILE* f;
    f = fopen("mapa.txt", "r");
    if (f == 0) {
        printf("Erro na leitura do mapa\n");
        exit(1);
    }
    fscanf(f, "%d %d", &(m->linhas), &(m->colunas));
    alocamapa(m);
    for (i = 0; i < m->linhas; i++) {
        fscanf(f, "%s", m->matriz[i]);
    }
    fclose(f);
}

void imprimemapa(MAPA* m) {
    for (i = 0; i < m->linhas; i++) {
        printf("%s\n", m->matriz[i]);
    }
}

fogefoge.c

#include <stdio.h>
#include <stdlib.h>
#include "fogefoge.h"
#include "mapa.h"

MAPA m;
int i, j;

int acabou() {
    return 0;
}

void move(char direcao) {
    int x, y;
    for (i = 0; i < m.linhas; i++) {
        for (j = 0; j < m.colunas; j++) {
            if (m.matriz[i][j] == '@') {
                x = i;
                y = j;
                break;
            }
        }
    }

    switch (direcao) {
        case 'a':
            m.matriz[x][y - 1] = '@';
            break;
        case 'w':
            m.matriz[x - 1][y] = '@';
            break;
        case 's':
            m.matriz[x + 1][y] = '@';
            break;
        case 'd':
            m.matriz[x][y + 1] = '@';
            break;
    }
    m.matriz[x][y] = '.';
}

int main() {
    lemapa(&m);

    do {
        imprimemapa(&m);

        char comando;
        scanf(" %c", &comando);

        move(comando);

    } while (!acabou());

    liberamapa(&m);

    return 0;
}

Compilação: Compile os arquivos separadamente e depois linke-os:

gcc -o fogefoge mapa.c fogefoge.c

Isso deve resolver os erros de redefinição e conflitos de tipos.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.