Estou usando a IDE CodeBlocks e ao tentar rodar o programa aparece a mensagem de erro acima. Como resolver? Eis o meu código.
fogefoge.c
#include <stdio.h>
#include <stdlib.h>
#include "fogefoge.h"
#include "mapa.h"
MAPA m;
/* A struct consta no fogefoge.h e foi renomeada
pelo typedef Neste caso a estrutura tem um char matriz
um int linhas e um int colunas.
Dessa forma, para apontar as variáveis dentro
da struct basta colocar o nome dado que aqui
é "m" e ponto(.)*/
void move(char direcao) {
// acha a posição do foge foge
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){
// move o foge foge
case 'a':
m.matriz[x][y-1] = '@';
break;
case 'w':
m.matriz[x-1][y] = '@';
break;
case 'd':
m.matriz[x][y+1] = '@';
break;
case 's':
m.matriz[x+1][y] = '@';
break;
// neste momento há 2 foge foge no mapa
}
m.matriz[x][y] = '.';
// transforma um dos foge foge em vazio, neste caso ponto(.).
}
int acabou(){
return 0;
}
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.h
struct mapa {
/*struct é um conjunto de variáveis que pode abrigar
tipos primitivos diferentes */
char** matriz;
/* declara uma matriz. Como se trata de um ponteiro
de um ponteiro é preciso colocar dois asteriscos. */
int linhas;
int colunas;
};
typedef struct mapa MAPA;
void liberamapa(MAPA* m);
void alocamapa(MAPA* m);
void lemapa(MAPA* m);
void imprimemapa(MAPA* m);
mapa.c
#include <stdio.h>
#include <stdlib.h>
#include "mapa.h"
/*o parâmetro MAPA* m é usado nas funções
como ponteiro para "pegar" a struct que está
declarada em outro arquivo c, o fogefoge.c */
/*para apontar o endereço de memória basta
colocar o asterisco antes do m., então ficaria,
por exemplo, *m.linhas. Contudo, quando pegamos
um ponteiro de uma struct há um atalho na linguagem
C, que é o "->", então, neste caso, basta colocar
m->linhas, isto indica que é um ponteiro de uma
struct
*/
void liberamapa(MAPA* m) {
for(int i = 0; i < m->linhas; i++) {
/* Sempre que se fizer a alocação de memória é preciso liberá-la.
Como se trata de uma matriz. Primeiro libera-se as linhas */
free(m->matriz[i]);
}
free(m->matriz);
/* liberação de memória das colunas.*/
}
void alocamapa(MAPA* m) {
m->matriz = malloc(sizeof(char*) * m->linhas);
/* O malloc faz a alocação dinâmica da memória quando não se sabe o valor exato
que se vai utilizar. O sizeof calcula automaticamente quantos bytes
serão necessários. Neste caso, aloca-se primeiro o número de linhas.
O asterisco no char é para indicar que se está pegando de um ponteiro
de ponteiro. */
for (int i = 0; i < m->linhas; i++) {
m->matriz[i] = malloc(sizeof(char) * (m->colunas + 1));
/* Com essa instrução se aloca o número de colunas. O +1 é por causa do /0 */
}
}
void lemapa(MAPA* m) {
FILE* f;
// o tipo FILE* é um ponteiro especial para um arquivo
f = fopen("mapa.txt", "r");
/* o fopen abre o arquivo solicitado e recebe como
parâmetro o nome do arguivo e o tipo de abertura*/
if(f == 0) {
printf("Erro na leitura do mapa\n");
exit(1);
// Este if é caso o arquivo seja igual a zero aparecerá uma mensagem de erro
}
fscanf(f, "%d %d", &(m->linhas), &(m->colunas));
/* Este código vai buscar o número de linhas e colunas do mapa.txt e colocar
nas variáveis linhas e colunas. É necessário o símbolo de "&" porque o que
se busca é o endereço de memória. */
alocamapa(m);
for (int i = 0; i < 5; i++) {
fscanf(f, "%s", m->matriz[i]);
/* fscanf lê as linhas de um arquivo e tem como parâmetros a variável escolhida
para abrir o arquivo, no caso "f", a máscara da variável onde se quer guardar
a linha e o nome da variável. Se for array basta colocar o nome se for matriz
colocar o nome[]*/
}
fclose(f);
// fechamento do arquivo.
}
void imprimemapa(MAPA* m) {
// imprime o mapa.
for (int i=0; i <5; i++) {
printf("%s\n", m->matriz[i]);
}
}