3
respostas

Erro Compilação C - Exemplo Pacman

Estou fazendo o curso C III, onde estamos desenvolvendo o pacman (foge foge).

Estou com um problema de compilação e não sei onde está o erro. Inclusive já copiei o código deixado pelo instrutor descartando o meu e continua dando o seguintes erro.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Os includes estao todos correto.

Seguem blocos de codigos:

pacman.c

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

MAPA m;
POSICAO heroi;


int acabou() {
    return 0;
}

void move(char direcao) {

    if(direcao != 'a' && direcao != 'w' && direcao != 'd' && direcao != 's')
        return;

    int proximox = heroi.x;
    int proximoy = heroi.y;

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

    if(proximox >= m.linhas)
        return;
    if(proximoy >= m.colunas)
        return;
    if(m.matriz[proximox][proximoy] != '.')
        return;

    m.matriz[proximox][proximoy] != '@';
    m.matriz[heroi.x][heroi.y] = '.';
    heroi.x = proximox;
    heroi.y = proximoy;


}

int main() {

    lemapa(&m);
    encontramapa(&m, &heroi, '@');

    do {
        imprimemapa(&m);

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

        move(comando);

    } while (!acabou());

    liberamapa(&m);
}
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 < m->linhas; 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]);
    }
}

void encontramapa(MAPA* m, POSICAO* p, char c) {

    for(int i = 0; i < m->linhas; i++) {
        for(int j = 0; j < m->colunas; j++) {
            if(m->matriz[i][j] == c) {
                p->x = i;
                p->y = j;
                return;
            }
        }
    }

}
pacman.h

int acabou();
void move(char direcao);
mapa.h

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

typedef struct mapa MAPA;

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

struct posicao {
    int x;
    int y;
};

typedef struct posicao POSICAO;

void encontramapa(MAPA* m, POSICAO* p, char c);
3 respostas

Olá, Sergio!

O erro undefined reference to pode acontecer quando temos a referência de uma função, mas o compilador não consegue encontrar ela no arquivo. No seu caso temos quatro funções (lemapa, encontramapa, imprimemapa, liberamapa) que o compilador não consegue encontrar.

Ou seja, o problema é que as funções que estão faltando, estão no arquivo mapa.c. Você deve compilar os dois arquivos juntos. pacman.c e mapa.c em um executável só; no seu caso, pacman.out. Arquivos em c, não são importados uns para os outros como no caso do mapa.h e o fogefoge.h

Então ao usar o gcc, acrescente o arquivo mapa.c. Não esqueça de verificar se os dois arquivos estão no mesmo diretório.

gcc mapa.c pacman.c -o pacman.out 

Opa Bernardo!!! Muito obrigado!

Realmente era isto! Entendi sua explicação!

Eu estava apenas compilando o arquivo pacman.c e nao estava rodando. Funcionou agora!

Obrigado e um grande abraço!

De nada, amigo! Um abraço!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software