1
resposta

Erro ( incompatible types in assignment of 'void*' to 'char [5][11]'

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

char mapa [5] [10 +1];
int linhas;
int colunas;

int main(){

    FILE* f;

    f = fopen("mapa.txt", "r");
    if (f == 0){
        printf("Erro ao abrir o mapa, tente novamente em alguns instates :)\n");
        exit(1);
    }
    fscanf(f, "%d %d", &linhas, &colunas);
    printf("Linhas: %d, Colunas %d\n", linhas, colunas);

    mapa= malloc(sizeof(char*) * linhas); //o erro  é acusado aqui
        for (int i = 0; i < linhas; i++){
        mapa[i] = malloc(sizeof(char) * (colunas + 1));
    }

    for (int i = 0; i <= 5; i++){
        fscanf(f, "%s", mapa[i]);
    }
    for (int i = 0; i <= 5; i++){
        printf("%s\n", mapa[i]);
    }

    fclose(f);

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

    free(mapa);
}
1 resposta

Olá, Max! Tudo bem?

Durante a aula encontramos um obstáculo que seria lidar com tamanhos diferentes de mapas.

Uma possível estratégia seria ter uma matriz gigante, que suportasse o maior mapa possível. Por exemplo, uma matriz mapa[100][100]. Nosso programa então olharia apenas para a quantidade de linhas e colunas daquele mapa, em particular, que será sempre menor que 100x100.

Entretanto, a gente tem uma forma ainda melhor de fazer isso. Podemos utilizar a função malloc. O que essa função faz é receber como parâmetro a quantidade de bytes que precisa ser alocado, e nos devolve um ponteiro para o primeiro byte alocado.

Para que a linha mapa= malloc(sizeof(char*) * linhas); seja executada corretamente a variável mapa não pode mais ser declarada como char mapa [5] [10 +1];, já que a função nos devolve um ponteiro.

Com isso declaramos da seguinte maneira:

char** mapa;

Como já vimos, o char * não é um array, mas um ponteiro para um char. Da mesma forma, char ** é um ponteiro para um char . Tornando-se um ponteiro para um ponteiro para um caractere.

Caso tenha dúvida em alguma parte que não deixei clara, estou à disposição.

Abraços!