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

[Dúvida] Estou com problemas na função 'encontraMapa'

No fogefoge.c o compilador aponta um erro no "&heroi". Já no mapa.c estou tendo erro na função encontraMapa

fogefoge.c:

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

MAPA m;
POSICAO heroi;


int acabou() {
  return 0;
}

void move(char direcao) {
  
  m.matriz[heroi.x][heroi.y] = '.';

  switch(direcao) {
    case 'a':
      m.matriz[heroi.x][heroi.y-1] = '@';
      heroi.y--;
      break;
    case 'd':
      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;
  }
  
  
}

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 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;
        break;
      }
    }
  }

}

void liberaMapa(MAPA* m) {

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

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 leMapa(MAPA* m) {

  FILE* f;
    f = fopen("mapa.txt", "r");

    if(f == 0) {
      printf("Erro na leitura do arquivo\n");
      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 imprimeMapa(MAPA* m) {
  for(int i = 0; i < 5; 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 liberaMapa(MAPA* m);
void leMapa(MAPA* m);
void alocaMapa(MAPA* m);
void imprimeMapa(MAPA* m);
void encontraMapa(MAPA* m, POSICAO* p, char c);

fogefoge.h:

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

mapa.txt:

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

......-.
2 respostas
solução!

E aí, Lucas! Beleza?

Sobre esse "&heroi"

Então, no seu fogefoge.c, a parada é que a heroi tá como uma variável global do tipo POSICAO. Então, quando você joga o endereço dessa variável pra função encontraMapa, tem que usar esse &, sacou? Mas ó, a pegada é que heroi é do tipo POSICAO, não é um ponteiro. Então, usar o & é crucial quando você quer passar o endereço dela.

POSICAO heroi;  // É uma variável, não um ponteiro, man

Mas quando você chama a encontraMapa, tá tudo certo:

encontraMapa(&m, &heroi, '@');

Sobre essa função 'encontraMapa'

Agora, saca só a função encontraMapa no teu mapa.c:

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;
        break;  // Esse 'break' tá meio zoado aqui
      }
    }
  }
}

O rolê aqui é que o break só para o loop interno, mas você precisa sair dos dois, entendeu? Então, você pode usar uma flag ou dar uma arrumada no código pra parar os dois loops quando achar a posição. Uma dica é usar uma variável booleana pra marcar se achou ou não.

void encontraMapa(MAPA* m, POSICAO* p, char c)  {
  int achou = 0;  // Vê se achou o cara

  for(int i = 0; i < m->linhas && !achou; i++) {
    for(int j = 0; j < m->colunas; j++) {
      if(m->matriz[i][j] == c) {
        p->x = i;
        p->y = j;
        achou = 1;  // Achou, então para os loops
        break;  // Só o interno
      }
    }
  }
}

Com isso, quando achar a primeira ocorrência de c, os dois loops vão parar.

Espero que agora tenha ficado mais claro.

Entendi, esclareceu bem minha duvida. Valeu mano!!