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

[Dúvida] Retornaram vários erros, alguns eu consertei mas esse não entendi.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

6 respostas

main.cpp

#include <iostream>
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>
#include "functions.h"

using namespace std;

MAPA m;

int main()
{
    setlocale(LC_ALL,"");  // Ativa o uso de acentos
   
    leMapa(&m);
   
    do{
        char comando;
        imprimeMapa(&m);
        
        scanf(" %c", &comando);
        move(comando, &m);
        
       
    }while(!acabou());

    liberaMapa(&m);

    system("pause");
    return 0;
}


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 'w':
            m.matriz[x-1][y] = '@';
            break;
        case 's':
            m.matriz[x+1][y] = '@';
            break;
        case 'd':
            m.matriz[x][y+1] = '@';
            break;
    }

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

functions.h

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

void liberaMapa(MAPA* m);
void leMapa(MAPA* m);
void alocaMapa(MAPA* m);
void imprimeMapa(MAPA* m);
int acabou();
void move(char direcao, MAPA* m);

mapa.c

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

void liberaMapa(MAPA *m)
{
    // Liberação da memória alocada
    for (int i = 0; i < m->linhas; i++)
    {
        free(m->matriz[i]);
    }
    free(m->matriz);
}

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);
    
    // Leitura do mapa do arquivo
    for (int i = 0; i < m->linhas; i++) 
    {
        fscanf(f, "%s", m->matriz[i]);
    }

    fclose(f);
}

void alocaMapa(MAPA *m)
{
    // Alocando dinamicamente da matriz
    m->matriz = (char**)malloc(sizeof(char*) * m->linhas);
    for (int i = 0; i < m->linhas; i++)
    {
    m->matriz[i] = (char*)malloc(sizeof(char) * (m->colunas + 1)); // +1 para o caractere nulo
    }
}

void imprimeMapa(MAPA *m)
{
    // Impressão do mapa
    for (int i = 0; i < m->linhas; i++) 
    {
        printf("%s\n", m->matriz[i]);
    }
}

Boa tarde, Pedro! Joia?

Analisando e testando o seu projeto identifiquei alguns pontos que estavam causando os erros, vou apresentá-los em sequência e separados para ficar mais fácil seu entendimento.

  1. Alterar importação no seu arquivo mapa.cpp: nesse arquivo você está importando o arquivo de header mapa.h, mas você tem apenas o arquivo funcitions.h então deve alterar a importação #include "mapa.h" para:

    #include "functions.h"
    
  2. Retirar o parâmetro MAPA da função move estabelecida no arquivo functions.h: dentro do arquivo a declaração da função move necessita de apenas um parâmetro e não dois, então não é necessário passar o parâmetro do mapa, logo a declaração deve estar assim:

    void move(char direcao);
    
  3. Modificar a passagem de parâmetros no arquivo main.cpp: dentro do arquivo você está chamando a função move na linha 22, nela você está passando &m que é um Struct de MAPA como parâmetro, mas como modificamos anteriormente, não precisa passar, então remova. Seu código main ficará assim:

    int main()
    {
        setlocale(LC_ALL,"");  // Ativa o uso de acentos
    
        leMapa(&m);
    
        do{
            char comando;
            imprimeMapa(&m);
    
            scanf(" %c", &comando);
            move(comando);
    
    
        }while(!acabou());
    
        liberaMapa(&m);
    
        system("pause");
        return 0;
    }
    

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Não consegui perceber o que você mudou no main, mesmo lendo seu comentário.

solução!

Opa, Pedro!

Foi um equívoco meu, no método move eu deveria ter retirado o parâmetro &m, mas acabei esquecendo. Mas já editei o código acima com essa alteração.

Peço desculpas pelo meu erro!