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

Erro segmentation fault


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

char** mapa;
int linhas;
int colunas;
FILE* f;

void tamanhodomapa()
{

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

        if(f == 0)
        {
                printf("erro na abertura do arquivo\n");
                exit(1);
        }

        fscanf(f, "%d %d", &linhas, &colunas);
        printf("%d-%d\n", linhas, colunas);
}

void alocamapa()
{
        tamanhodomapa();

        mapa = malloc(sizeof(char*) * linhas); //alocar memoria para o mapa
        for(int i = 0; i < linhas; i++)
        {
                mapa[i] = malloc(sizeof(char) * colunas + 1); //alocar memoria para as colunas
        }

        for(int i = 0; i < linhas; i++) 
        {
                fscanf(f, "%s", mapa[i]); //ler todas as linhas e botar em mapa[i]
        }

        fclose(f);
}

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

void imprimimapa()
{
        for(int j = 0; j < linhas; j++)
        {
                printf("%s\n", mapa[j]); //imprimir as linhas do mapa
        }
}

void personagem(char direcao)
{
        int x;
        int y;

        for(int i = 0; i < linhas; i++)
        {
                for(int j; j < colunas; j++)
                {
                        if(mapa[i][j] == '@')
                        {
                                x = i;
                                y = j;
                                break;
                        }
                }
        }

        switch(direcao)
        {
                case 'a':
                        mapa[x][y-1] = '@';
                        break;
                case 's':
                        mapa[x-1][y] = '@';
                        break;
                case 'd':
                        mapa[x][y+1] = '@';
                        break;
                case 'w':
                        mapa[x+1][y] = '@';
                        break;
        }
        mapa[x][y] = '.';

}

int main()
{
        int acabou = 0;
        alocamapa();

        do
        {
                imprimimapa();

                char comando;

                scanf(" %c", &comando);
                personagem(comando);

        }while(!acabou);
        liberamapa();

}
2 respostas
solução!

Olá Victor.

A variável j do segundo for não foi inicializa com 0 e assim está vindo um valor qualquer nela e dessa maneira seu segundo for não estava rodando. E se ele não rodar você nunca encontrava o personagem @ e por isso suas variáveis x e y ficavam com valores inválidos que quando acessados no array mapa geram esse erro:

  for(int j = 0; j < colunas; j++)

A correção é só incluir o int j = 0, ficando assim:

void personagem(char direcao)
{
        int x;
        int y;

        for(int i = 0; i < linhas; i++)
        {
                for(int j = 0; j < colunas; j++)
                {
                        if(mapa[i][j] == '@')
                        {
                                x = i;
                                y = j;
                                break;
                        }
                }
        }

Outro ponto que notei é que o w e o s estão trocados e o personagem acaba andando errado:

switch(direcao)
        {
                case 'a':
                        mapa[x][y-1] = '@';
                        break;
                case 'w':
                        mapa[x-1][y] = '@';
                        break;
                case 'd':
                        mapa[x][y+1] = '@';
                        break;
                case 's':
                        mapa[x+1][y] = '@';
                        break;
        }

O s soma no x porque o nosso ponto mais 'alta' é o 0 então conforme descemos o x vai aumentar.

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

Bons Estudos.

Valeu Igor! eu tava quebrando a cabeça aqui faz um tempinho já! hahah

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