Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro ao compilar o Jogo.

Olá pessoal, alguém me da uma luz por favor ? Bom, ao compilar o jogo acabei me deparando com o seguinte erro:

C:\Users\wwwan\Documents\logica\linguagem_C\fogefoge>gcc fogefoge.c -o fogefoge.exe
C:\Users\wwwan\AppData\Local\Temp\ccwEqWNt.o:fogefoge.c:(.text+0x16a): undefined reference to `lemapa'
C:\Users\wwwan\AppData\Local\Temp\ccwEqWNt.o:fogefoge.c:(.text+0x186): undefined reference to `encontra_mapa'
C:\Users\wwwan\AppData\Local\Temp\ccwEqWNt.o:fogefoge.c:(.text+0x192): undefined reference to `imprimemapa'
C:\Users\wwwan\AppData\Local\Temp\ccwEqWNt.o:fogefoge.c:(.text+0x1cb): undefined reference to `liberamapa'
collect2.exe: error: ld returned 1 exit status

Minhas linhas de código tá assim, será que tem algum erro ?

fogefoge.c

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

MAPA m;
POSICAO heroi;

//Função para finalizar o jogo, 'provisoria'
int acabou(){
  return 0;
}

//Função que move o @.
void move(char direcao) {

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

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

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


int main() {

  setlocale (LC_ALL, "portuguese");

  lemapa(&m);
  encontra_mapa(&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"

//Função que encontra a posição do @
void encontra_mapa(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;
              break;
          }
        }
      }

}

//Função para ler o mapa
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(int i = 0; i < m->linhas; i++){
    fscanf(f, "%s", m->matriz[i]);
  }

  fclose(f);

}


//Função malloc
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);
  }
}


//Função para liberar o mapa e a função malloc
void liberamapa(MAPA* m) {
    for(int i = 0; i < m->linhas; i++){
      free(m->matriz[i]);
    }
    free(m->matriz);
}


//Função que imprime o mapa na tela.
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;

struct posicao
{
  int x;
  int y;
};
typedef struct posicao POSICAO;

void lemapa(MAPA *m);
void alocamapa(MAPA *m);
void liberamapa(MAPA *m);
void imprimemapa(MAPA *m);
void encontra_mapa(MAPA *m, POSICAO *p, char c);
2 respostas
solução!

Olá, Anderson

O problema de compilação está acontecendo aparentemente porque o arquivo "mapa.c" não está sendo compilado junto do arquivo "fogefoge.c"

Você está digitando no terminal:

gcc fogefoge.c -o fogefoge.exe

E para adicionar o outro arquivo para compilação é só fazer:

gcc fogefoge.c mapa.c -o fogefoge.exe

Obrigado pela ajuda. ;D