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

Erro na Leitura do Mapa

Olá pessoal, no curso CIII: Recursos avançados da linguagem estou com um problema sério, da vídeo aula 2.3 para a aula 2.4 o código não acha o Mapa, "sem brincadeira" já refiz a aula 2.4 mais de 5 vezes para tentar achar onde estou errando, mais não achei, aparente mente meu código está idêntico ao do professor, alguém poderia me auxiliar? Segue meu código abaixo:



 fogefoge.c

# include <stdio.h>
# include <stdlib.h>
# include "fogefoge.h"
# include "mapa.h"

MAPA m;
int i;


int acabou() {
    return 0;             
             }

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

    // acha a posição do foge foge
    int i;
    for(i=0; i<m.linhas; i++){
        int j;
        for(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]='.';

                    }

int main() {

    lemapa(&m);    

    do{

    imprimemapa(&m);

    char comando;
    scanf(" %c", &comando);
    move(comando);

      } while (!acabou()); 


    liberamapa(&m);

           }

fogefoge.h

void move(char direcao);

int acabou();

mapa.h


struct mapa {

    char** matriz;

    int linhas;

    int colunas;

            };

typedef struct mapa MAPA;

void liberamapa(MAPA* m);

void lemapa(MAPA* m);

void alocamapa(MAPA* m);

void imprimemapa(MAPA* m);

mapa.c 

# include <stdio.h>

# include <stdlib.h>

# include "mapa.h"


void liberamapa(MAPA* m){
    for(i = 0; i<m->linhas; i++) {
        free(m->matriz[i]);
                                 }
    free(m->matriz);                 
                        }

void alocamapa(MAPA* m){
    //alocando mapa de forma dinamica//
m->matriz = malloc(sizeof(char*) * m->linhas);
for (i=0;i<m->linhas;i++) {
    m->matriz[i] = malloc(sizeof(char) * (m->colunas + 1));
                          }                
                       }                 

void lemapa(MAPA* m){
    FILE* f;    //obrir arquivo //
    f = fopen("mapa.txt", "r");
    if (f==0) {
        printf("Erro na leitura do mapa\n");
        exit(1);
              }

fscanf(f, "%d %d", &(m->linhas), &(m->colunas));    //lendo Linhas e Colunas

    alocamapa(m);

for(i=0;i<5;i++) {
    fscanf(f, "%s", m->matriz[i]);
                 }

    fclose(f);    
                    }



void imprimemapa(MAPA* m){
    for(i=0;i<5;i++) {
    printf("%s\n", m->matriz[i]);
                      }
                         }
14 respostas

Esqueci de postar o próprio mapa aqui :D


mapa.txt

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

oi Leandro

Quando voce diz que não acha o mapa, o que quer dizer? Que erro está dando?

Olá Paulo, o erro é este:

[Error] Id returned 1 exit status

Bom dia Leandro,

Tenta remover aquela declaração global da variável i por favor? Não será só isso que vai resolver o erro, mas não aconselho essa variavel global assim. Se dois trechos usarem esse i na pilha de execucao, o programa ficara louco e a chance de um seg fault será grande. (pode ser isso que esteja acontecendo mas nao acho)

Sobre o erro em si, poderia colocar uns printfs em diversos momentos do codigo? Assim conseguimos entender a saida e em que momento da o erro.

Olá Guilherme, conforme comentei no post da minha dúvida o programa para de achar o mapa da aula 2.3 para 2.4, sendo que o professor no curso declara as variáveis dentro do for, eu estou usando o DevC++ e tenho que declara-la fora, a variável "i" só é usada na leitura do mapa, também já havia colocado esta variável dentro da struct mapa porém o erro é o mesmo. Quanto ao printf que você solicitou acima não tenho como fazer pois o código nem abri, não chega a executar, somente aparece [Error] Id returned 1 exit status

Oi Leandro,

Você não consegue abrir e editar esse código pelo DevC++ ou qualquer outro editor? Esse erro aparece em qual momento?

E além do [Error] Id returned 1 exit status, o que mais aparece? Pode nos mostrar a mensagem completa?

Olá Rodrigo,

Consigo abrir o código e editar normalmente, no DevC++, Sublime Text etc..., porém o erro é sempre o mesmo. Como comentei acima até a aula 2.3 o programa executa sem problemas, mais ao final da aula 2.4 ao apertar F11 no DevC++ "Compile & Run" aparece a mensagem de erro em vermelho na parte inferior abaixo, (somente a ultima linha) estou colocando abaixo as outras linhas que aparecem porém não está escrito erro.

FILE                                              MESSAGE
C:\Users\Leandro\AppData\Local\Temp\cc0pO3r9.o    Foge_Foge3.c:(.text+0x1a5): undefined reference to `lemapa'

C:\Users\Leandro\AppData\Local\Temp\cc0pO3r9.o    Foge_Foge3.c:(.text+0x1b4): undefined reference to `imprimemapa'

C:\Users\Leandro\AppData\Local\Temp\cc0pO3r9.o    Foge_Foge3.c:(.text+0x1ed): undefined reference to `liberamapa'

c:\industrial automation\dev-cpp\mingw64\x86_64-w64-mingw32\bin\ld.exe    C:\Users\Leandro\AppData\Local\Temp\cc0pO3r9.o: bad reloc address 0x0 in section `.pdata'

C:\Users\Leandro\Desktop\Cursos de Programação\Linguagem C\FogeFoge\FogeFoge - Antigo\Foge Foge3\collect2.exe    [Error] ld returned 1 exit status

Oi Leandro,

Repara que ele não está achando as referencias lemapa, liberamapa, etc. Experimenta mudar o seu include tirando o espaço entre o # e a palavra include?

Fora isso, você já experimentou dar uma olhada no código final da aula? Está sempre no final da explicação de texto: https://gist.github.com/mauricioaniche/3faed15c46f8466e88c3

Olá novamente Rodrigo, a questão do espeço é uma coisa que ainda não havia tentado, porém não mudou nada, o erro continua sendo o mesmo. Quanto ao código passado no final da explicação foi uma das primeiras coisas que fiz, "e o erro é o mesmo", tente você, deste mesmo link que você me enviou cole no seu IDE e compile, veja se vai funcionar, pois comigo está dando o erro que lhe passei acima.

Olá Leandro!

Aparentemente está faltando compilar ou linkar o "mapa", por isso o aviso de undefined reference. Tente o seguinte comando no terminal:

gcc -o foge fogefoge.c mapa.c

Com isso, compilamos o "fogefoge.c" e o "mapa.c" gerando os arquivos "fogefoge.o" e "mapa.o". Como o "fogefoge.o" depende do "mapa.o", precisamos juntar os dois para gerar um executável que chamamos de "foge" nesse caso.

Após esse comando, você deve conseguir executar o seu código com o comando:

./foge

Nos testes que realizei aqui com o seu código, também precisei declarar a variável i antes de cada um dos for no arquivo "mapa.c". Para isso, basta adicionar a linha abaixo antes de cada for no seu código do "mapa.c":

int i;

Abraço!

Olá Jeferson, eu estou usando o DevC++, eu acredito que o código estando correto deve rodar em qualquer IDE certo? Pergunto pois este é meu terceiro curso de C, sendo que os 1 e 2 são aqui do Alura também, porém só nesta aula que estou parado a um bom tempo, fiz conforme as vídeo aulas, e o link de download também da o mesmo erro. Eu acredito que o comando gcc -o foge fogefoge.c mapa.c no DevC++ nada mais é que F9 = Compile, é a mesma coisa não? E isso eu fazia tanto no mapa.c quanto o fogefoge.c, fiz agora a tentativa de declarar a variável int i; antes de cada FOR de mapa.c, mais não deu certo... Você informou acima que fez com que meu código rodasse, você teria como posta-lo aqui pois irei tentar no DevC++, e caso não rode irei encerrar a dúvida, afinal você informou que rodou ai.

Olá Leandro!

No DevC++, você precisa se certificar que todos os arquivos fonte (todos os .c e .h) estão dentro de um único projeto. Caso eles ainda não estejam em um projeto, o DevC++ tratará cada arquivo fonte como um aplicativo independente desconsiderando as dependências.

Caso você ainda não tenha um projeto, basta você ir em File > New Project. Depois, vá em Project > Add to project... e selecione todos os fontes do seu aplicativo.

Agora sim, você pode compilar pois o DevC++ irá considerar a dependência entre os arquivos durante a compilação.

Faça o teste e veja se isso resolve o problema!

Abraço!

Leandro, conseguiu? Um ponto positivo de toda essa discussão é que ela acabou expandindo o problema e acabei aprendendo bastante coisa aqui, principalmente no que fiz respeito à alguns detalhes de infraestrutura.

Só preciso saber se você conseguiu resolver. Caso não tenha resolvido, uma opção é continuar estudando (claro, se esse problema não o trava) e monitorar esse post.

Eu só não quero que você esfrie e desanime no seu estudo por ter esbarrado com esse problema.

Aguardo seu feedback.

solução!

Olá Jeferson e Flavio, felizmente depois de tanto bater cabeça consegui passar pelo meu primeiro problema sério com um código, era completamente leigo até começar aqui no Alura, mais acredito que estou aprendendo muito. Jeferson, seu post me ajudou a solucionar o problema, é bem isso mesmo, porém o que fez eu demorar mais éo fato de você não informar que devemos "salvar" o projeto dentro da pasta onde os outros arquivos já estavam salvos, o arquivo " .h " não deve ser salvo dentro do projeto, somente na pasta e também demos apagar o arquivo main. Agora irei continuar meu curso de CIII, muito obrigado pessoal por toda a ajuda.