2
respostas

Undefined reference to 'imprimemapa' /'lemapa'/'liberamapa'

Pelo que pesquisei acho que o code blocks está com problemas para compilar os arquivos todos juntos. A opção de acessar as propriedades do projeto não está habilitada também.

fogefoge.c:

#include <stdio.h>

#include <stdlib.h>

#include "pacman.h"

#include "mapa.h"

MAPA m;

int acabou(){ return 0; }

void move(char direcao){ int x; int y;

for(int i = 0; i < m.linhas; i++){
    for(int 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 's':
        m.matriz[x+1][y] = '@';
        break;
    case 'd':
        m.matriz[x][y+1] = '@';
        break;
    case 'w':
        m.matriz[x-1][y] = '@';
        break;
}

m.matriz[x][y] = '.';

}

int main() {

lemapa(&m);


do{
    imprimemapa(&m);

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


}while(!acabou());
liberamapa(&m);

}

fogefoge.h:

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

mapa.c:

#include <stdio.h>

#include <stdlib.h>

#include "mapa.h"

void lemapa(MAPA* m) { FILE* f; f = fopen("mapa.txt", "r"); if(f == 0) { printf("Erro na leitura do mapa"); exit(1); }

fscanf(f, "%d %d", &(m->linhas), &(m->colunas));
alocamapa(m);

for(int i = 0; i < 5; i++) {
    fscanf(f, "%s", m->matriz[i]);
}

fclose(f);

}

void alocamapa(MAPA* m) { m->matriz = malloc(sizeof(char*) * m->linhas);

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

}

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

free(m->matriz);

}

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

mapa.h:

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

typedef struct mapa MAPA;

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

2 respostas

Olá, Willian! Tudo bem?

O problema é que o programa está separado em partes e o compilador não consegue encontrar todas as partes sozinho. Você precisa fazer a compilação em partes, deste modo:

$ gcc mapa.c -o mapa.o
$ gcc FogeFoge.c -o FogeFoge.o
$ gcc mapa.o FogeFoge.o -o FogeFoge

Assim, você garante que cada parte foi compilada individualmente antes de gerar o programa final.

Outra alternativa é fazer tudo na mesma linha:

$ gcc mapa.c FogeFoge.c -o FogeFoge

O importante é passar todos os arquivos de implementação que você criou.

Você está utilizando Windows?

Olá, Larissa. O problema é que estou usando o Code Blocks para compilar, e eu apenas aperto um botão e ele compila por si só. Acho que não é possível realizar isso manualmente. Acho que vou precisar migrar para outro compilador, muito obrigado!