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

[Bug] 'Erro na leitura do mapa'

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

using namespace std;

MAPA m;

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

    liberaMapa();

    system("pause");
    return 0;
}

void liberaMapa()
{
    // Libera��o da mem�ria alocada
    for (int i = 0; i < m.linhas; i++)
    {
        free(m.matriz[i]);
    }
    free(m.matriz);
}

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

    fclose(f);
}

void alocaMapa()
{
    // Aloca��o din�mica 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()
{
    // Impress�o do mapa
    for (int i = 0; i < m.linhas; i++) 
    {
        printf("%s\n", m.matriz[i]);
    }
}

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] = '.';
}

O que está errado nesse código, ele estava funcionando até eu colocar a struct MAPA.

9 respostas

Olá, Pedro! Joia?

Pelo que você descreveu, parece que o problema começou após a introdução da struct MAPA. Vamos verificar alguns pontos que podem estar causando o erro.

Então, certifique-se de que a definição da struct MAPA e o typedef estão corretos no seu arquivo functions.h. Eles devem estar algo assim:

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

Além disso, verifique se você está incluindo corretamente o functions.h no seu arquivo principal e se não há nenhum problema de escopo ou definição.

Caso isso não resolva o seu problema, peço que compartilhe todo o seu código presente no arquivo functions.h e functions.c para que assim eu realize testes para identificar o porquê não está funcionando corretamente.

Espero ter ajudado e fico à disposição!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.
#include <iostream>
#include <stdlib.h>
#include <locale.h>
#include "functions.h"

using namespace std;

MAPA m;

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

    liberaMapa();

    system("pause");
    return 0;
}

void liberaMapa()
{
    // Libera��o da mem�ria alocada
    for (int i = 0; i < m.linhas; i++)
    {
        free(m.matriz[i]);
    }
    free(m.matriz);
}

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

    fclose(f);
}

void alocaMapa()
{
    // Aloca��o din�mica 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()
{
    // Impress�o do mapa
    for (int i = 0; i < m.linhas; i++) 
    {
        printf("%s\n", m.matriz[i]);
    }
}

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] = '.';
}

Esse é o arquivo .cpp

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

void liberaMapa();
void leMapa();
void alocaMapa();
void imprimeMapa();
int acabou();
void move(char direcao);

functions.h

functions.c, esse eu não cheguei na parte de criá-lo.

Olá, Pedro! Tudo bem?

Peço desculpa pela demora em respondê-lo!

Analisando o seu código não encontrei nenhum problema na estrutura do mesmo que poderia causar o erro na leitura do mapa. Contudo, ao realizar testes no mesmo, encontrei um problema com a biblioteca #include <iostream>, que é uma biblioteca exclusiva para linguagem C++ e não deveria ser usada em códigos C.

Mas como você chegou em um erro de execução, a qual é o erro na leitura, imagino que você deve está usando a extensão correta. Mas enfim, voltando ao erro da leitura, quando fui testar o mesmo com o seu código não recebi nenhum erro, então peço que verifique se está utilizando o .txt correto para o mapa, como o que segue abaixo:

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

Segue também um GIF demostrando o projeto rodando e o erro aparente quando se utiliza a extensão .c e não .c++:

GIF de demonstração de execução do código

Então a solução para o seu caso é verificar se o mapa está igual ao que compartilhei e se o mesmo está nomeado como mapa.txt.

Espero te ajudado!

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

Esse é o meu mapa. Troquei para main.c++ e mesmo assim nada. Esse erro começou quando eu troquei do dev.c++ para o vsCode usando o compiler mingw

Bom dia, Pedro!

Se o erro começou a ocorrer quando você mudou de plataforma/IDE, peço que demonstre a forma em que você está executando o projeto, via terminal ou utilizando o botão de execução do VSCode. Pois, pode ser que você está compilando de uma forma que não seja a certa, além disso, recomendo verificar se o caminho para o arquivo mapa.txt está correto.

Mas caso mesmo assim não funcione, recomendo que tente usar alternativas online:

Ambos sites contam com um ambiente onde você pode adicionar vários arquivos, sendo o primeiro um pouco mais simples e restrito a compilar códigos em C e o segundo tendo compatibilidades com diversas linguagens.

Estou no aguardo do seu retorno!

Eu utilizo a tecla: F6. O arquivoestá salvo no mesmo diretório, então eu uso esse caminho:

FILE *f;
    f = fopen("mapa.txt", "r");
solução!

Voltei para o Dev.C++ e funcionou. É uma pena, no VSCode é bem melhor.