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

[Bug] Não está sendo executado corretamente

#include <iostream>
#include <stdlib.h>

using namespace std;

char** mapa;
int linhas, colunas;

int main()
{
    setlocale(LC_ALL,"");  // Ativa o uso de acentos
    // -------------------------------
    // matriz 5 x 10
    
    int i;
    FILE *f;
    
    f = fopen("mapa.txt" , "r");
    fscanf(f, "%d %d", &linhas, &colunas);
    
    //cout << linhas << " - " << colunas << "\n"; 
    
    if(f == 0) 
    {
        printf("Erro na leitura do mapa");
        exit(1);
    }
    
    for(int i = 0; i < 7; i++) 
    {
        fscanf(f, "%s", mapa[i]);
    }
    
    for(int i = 0; i < 7; i++) 
    {
        printf("%s\n", mapa[i]);
    }
    
    ////////////
    mapa = malloc(sizeof(char*) * linhas);
    for(i = 0; i < linhas;i++)
    {
        mapa[i] = malloc(sizeof(char) * (colunas + 1));
    }
    
    ////////////
    
    fclose(f);
    
    for(i = 0; i < linhas;i++)
    {
        free(mapa[i]);
    }
    free(mapa);
    // -------------------------------
    system("pause");
    return 0;
}
2 respostas

Está dando erro na função malloc()

solução!

Olá Pedro! Joia?

Vamos ajustar seu código para garantir que a alocação e leitura sejam feitas corretamente. Aqui estão alguns pontos que precisam ser corrigidos:

  1. Alocação de Memória Antes da Leitura: A alocação de memória para mapa deve ser feita antes de tentar ler os dados do arquivo.
  2. Verificação do Arquivo: A verificação se o arquivo foi aberto corretamente deve ser feita logo após a tentativa de abertura.
  3. Laços de Leitura e Impressão: Os laços que leem e imprimem o mapa devem usar as variáveis linhas e colunas corretamente.

Aqui está a versão corrigida do seu código:

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

using namespace std;

char** mapa;
int linhas, colunas;

int main()
{
    setlocale(LC_ALL,"");  // Ativa o uso de acentos

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

    if (f == nullptr) 
    {
        printf("Erro na leitura do mapa");
        exit(1);
    }

    fscanf(f, "%d %d", &linhas, &colunas);

    // Alocação dinâmica da matriz
    mapa = (char**)malloc(sizeof(char*) * linhas);
    for (int i = 0; i < linhas; i++)
    {
        mapa[i] = (char*)malloc(sizeof(char) * (colunas + 1)); // +1 para o caractere nulo
    }

    // Leitura do mapa do arquivo
    for (int i = 0; i < linhas; i++) 
    {
        fscanf(f, "%s", mapa[i]);
    }

    // Impressão do mapa
    for (int i = 0; i < linhas; i++) 
    {
        printf("%s\n", mapa[i]);
    }

    fclose(f);

    // Liberação da memória alocada
    for (int i = 0; i < linhas; i++)
    {
        free(mapa[i]);
    }
    free(mapa);

    system("pause");
    return 0;
}

Pontos Importantes:

  • Alocação Dinâmica: A alocação da matriz mapa é feita após a leitura das dimensões do arquivo.
  • Leitura e Impressão: Os laços usam linhas para iterar corretamente sobre o mapa.
  • Verificação do Arquivo: A verificação se o arquivo foi aberto corretamente é feita imediatamente após a tentativa de abertura.

Espero ter ajudado e bons estudos!

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