Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Segmentation fault (core dumped)

Opa blz, eu estava tentando fazer o exercício, mas a mensagem Segmentation fault (core aparecia) aparecia quando eu tentava executar o programa, eu não sei porque ou como consertar.

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

int main(){
    int linhas, colunas;
    char** mapa;
    lemapa(mapa, linhas, colunas);
    imprimemapa(mapa, linhas, colunas);
    liberamapa(mapa, linhas, colunas);
    return 0;
}

void lemapa(char** mapa, int linhas, int colunas){
    FILE* f = fopen("mapa.txt", "r");
    if(f == NULL) {
        printf("erro ao tentar abrir o mapa.");
        exit(1);
    }
    fscanf(f,"%i %i", &linhas, &colunas);
    alocamapa(linhas, colunas, mapa);
    for(int i = 0; i < linhas; i++){
            fscanf(f,"%s", mapa[i]);
        }
    fclose(f);
}

void alocamapa(int linhas, int colunas,char** mapa){
    mapa = malloc (sizeof(char*) * linhas);
    for(int i = 0; i < linhas;i++){
            mapa[i] = malloc(sizeof(char) * colunas + 1);
        }
}

void imprimemapa(char** mapa,int linhas, int colunas){
    for(int i = 0; i < linhas; i++){
            printf("%s", mapa[i]);
    }
}

void liberamapa(char** mapa, int linhas, int colunas){
    for(int i = 0; i < linhas; i++){
            free(mapa[i]);
    }
}
1 resposta
solução!

Olá Rafael.

O problema é com o ponteiro da variável mapa, quando você executa a função alocamapa, a memoria é alocada para a variável mapa que foi criada dentro do escopo da função. O instrutor na aula 2 vai apresentar structs e dessa maneira poderemos utilizar os ponteiros sem grandes problemas.

Infelizmente sem utilizar structs a unica solução que encontrei, foi declarar o mapa como variável global e não mais passar por parâmetro nas funções.

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

char** mapa;

int main(){
    int linhas, colunas;

    lemapa(&linhas, &colunas);
    imprimemapa(linhas, colunas);
    liberamapa(linhas, colunas);
    return 0;
}

void lemapa(int* linhas, int* colunas){
    FILE* f = fopen("mapa.txt", "r");
    if(f == NULL) {
        printf("erro ao tentar abrir o mapa.");
        exit(1);
    }
    fscanf(f,"%i %i", linhas, colunas);
    alocamapa(*linhas, *colunas);
    for(int i = 0; i < *linhas; i++){
            fscanf(f,"%s", mapa[i]);
        }
    fclose(f);
}

void alocamapa(int linhas, int colunas){
    mapa = malloc (sizeof(char*) * linhas);
    for(int i = 0; i < linhas;i++){
            mapa[i] = malloc(sizeof(char) * colunas + 1);
        }
}

void imprimemapa(int linhas, int colunas){
    for(int i = 0; i < linhas; i++){
            printf("%s\n", mapa[i]);
    }
}

void liberamapa(int linhas, int colunas){
    for(int i = 0; i < linhas; i++){
            free(mapa[i]);
    }
}

Outra questão é com as variáveis linhas e colunas, quando passamos ela para a função lemapa devemos passar seus ponteiros, já que os valores dela serão trocados e precisamos que as variáveis que criamos no main recebam essa atualização de valores.

void lemapa(int* linhas, int* colunas){
    FILE* f = fopen("mapa.txt", "r");
    if(f == NULL) {
        printf("erro ao tentar abrir o mapa.");
        exit(1);
    }
    fscanf(f,"%i %i", linhas, colunas);
    alocamapa(*linhas, *colunas);
    for(int i = 0; i < *linhas; i++){
            fscanf(f,"%s", mapa[i]);
        }
    fclose(f);
}

Espero ter ajudado, mas qualquer duvida não hesite em perguntar.

Bons Estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software