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

Arquivo fonte não compilado

Olá, estou fazendo o projeto no dev c++, entretanto, eu não consigo fazer com q rode o programa pq só aparece essa mensagem : Arquivo fonte não compilado. Eu criei um projeto no dev c++ para rodar todos os arquivos juntos

foge.cpp: (fiz uma função nesse código para que toda vez que o usuário digitar uma direção, a tela limpa o mapa anterior)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "foge.h"
#include "mapa.h"

MAPA m;


int acabou(){
    return 0;
}

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

    for(int i=0;i<m.linhas;i++){
        for(int 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] = '.';
}

void cls(void){
    printf("\033[1J\033[H");
}

int main() {

    lemapa(&m);

    do{

      system("cls"); 
      imprimemapa(&m);

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

    }while(!acabou());

    liberamapa(&m);
    getch();
}

foge.h:

void move(char direcao);
int acabou();
void cls(void);

mapa.cpp:

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


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

    fscanf(f, "%d %d", &(m->linhas), &(m->colunas));
    alocamapa(m);

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

    fclose(f);
}

void alocamapa(MAPA* m) {
    m->matriz = (char**) malloc(sizeof(char*) * m->linhas);

    for(int i = 0; i < m->linhas; i++) {
        m->matriz[i] = (char*) malloc(sizeof(char) * m->colunas + 1);
    }
}

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

    free(m->matriz);
}

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

mapa.h:

struct mapa{
    char** matriz;
    int linhas;
    int colunas;
};
typedef struct mapa MAPA;

void alocamapa(MAPA* m);
void lemapa(MAPA* m);
void liberamapa(MAPA* m);
void imprimemapa(MAPA* m);

mapa.txt:

|--------|
|...|..-.|
|..-|.@..|
|......-.|
|--------|
7 respostas
solução!

Olá Luiza! Pelo que vi, no que você postou aqui, você está tentando compilar o arquivo escrito em C como C++. Neste caso ele não vai compilar, pois existem diferenças entre essas duas linguagens, como sintaxe e os arquivos de cabeçalho. Assim você precisará mudar as configurações. Segue estes passos: 1º acesse "Tools"; 2º entre em "compiler options" e acesse "settings"; 3º em settings você deve acessar "code generation". Lá em baixo você verá: "Language standard(-std). Mude esta configuração para ISO C99.

Se caso você já configurou tudo certo, apenas precisará salvar o arquivo como '.c'.

Ex: mapa.c ao invés de mapa.cpp.

Olá Ezequiel, realizei o que você indicou , criei outro projeto e baixei os arquivos do código que o professor deixou (todos eles estão com o .c), Entretanto quando eu compilo o projeto aparece essas mensagens :

C:\Users\lulub\Music\Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2\fogefoge.o fogefoge.c:(.text+0x1c7): undefined reference to `lemapa'

C:\Users\lulub\Music\Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2\fogefoge.o fogefoge.c:(.text+0x1e6): undefined reference to `encontramapa'

C:\Users\lulub\Music\Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2\fogefoge.o fogefoge.c:(.text+0x1f5): undefined reference to `imprimemapa'

C:\Users\lulub\Music\Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2\fogefoge.o fogefoge.c:(.text+0x22e): undefined reference to `liberamapa'

C:\Users\lulub\OneDrive\Documentos\Linguagem C\Progamas\Projeto\collect2.exe [Error] ld returned 1 exit status 25

C:\Users\lulub\OneDrive\Documentos\Linguagem C\Progamas\Projeto\Makefile.win recipe for target 'Pacman.exe' failed

Ele me direciona para esse arquivo que se chama de "Make file.win" no qual eu desconheço:

# Project: Pacman
# Makefile created by Dev-C++ 5.11

CPP      = g++.exe
CC       = gcc.exe
WINDRES  = windres.exe
OBJ      = ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/fogefoge.o ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/mapa.o
LINKOBJ  = ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/fogefoge.o ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/mapa.o
LIBS     = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc
INCS     = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CXXINCS  = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
BIN      = Pacman.exe
CXXFLAGS = $(CXXINCS) -traditional-cpp -std=c99
CFLAGS   = $(INCS) -traditional-cpp -std=c99
RM       = rm.exe -f

.PHONY: all all-before all-after clean clean-custom

all: all-before $(BIN) all-after

clean: clean-custom
    ${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/fogefoge.o: ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/fogefoge.c
    $(CPP) -c ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/fogefoge.c -o ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/fogefoge.o $(CXXFLAGS)

../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/mapa.o: ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/mapa.c
    $(CPP) -c ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/mapa.c -o ../../../../../Music/Curso-C-III-Recursos-avan-ados-da-linguagem-capitulo2/mapa.o $(CXXFLAGS)

Olá tudo bem? Se você puder, poste o código que está no seu arquivo. Parece que ele não está encontrando a referência para as funções. Verifique se os arquivos de cabeçalho estão incluídos nos arquivos necessários.

Arquivo fogefoge.c:

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

MAPA m;
POSICAO heroi;


int acabou() {
    return 0;
}

void move(char direcao) {

    m.matriz[heroi.x][heroi.y] = '.';

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

}

int main() {

    lemapa(&m);
    encontramapa(&m, &heroi, '@');

    do {
        imprimemapa(&m);

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

        move(comando);

    } while (!acabou());

    liberamapa(&m);
}

arquivo mapa.c:

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

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

    fscanf(f, "%d %d", &(m->linhas), &(m->colunas));
    alocamapa(m);

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

    fclose(f);
}

void alocamapa(MAPA* m) {
    m->matriz = (char**) malloc(sizeof(char*) * m->linhas);

    for(int i = 0; i < m->linhas; i++) {
        m->matriz[i] = (char*) malloc(sizeof(char) * m->colunas + 1);
    }
}

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

    free(m->matriz);
}

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

void encontramapa(MAPA* m, POSICAO* p, char c) {

    for(int i = 0; i < m->linhas; i++) {
        for(int j = 0; j < m->colunas; j++) {
            if(m->matriz[i][j] == c) {
                p->x = i;
                p->y = j;
                return;
            }
        }
    }

}

Arquivo mapa.h:


struct mapa {
    char** matriz;
    int linhas;
    int colunas; 
};

typedef struct mapa MAPA;

void alocamapa(MAPA* m);
void lemapa(MAPA* m);
void liberamapa(MAPA* m);
void imprimemapa(MAPA* m);

struct posicao {
    int x;
    int y;
};

typedef struct posicao POSICAO;

void encontramapa(MAPA* m, POSICAO* p, char c);

arquivo fogefoge.h:

int acabou();
void move(char direcao);

arquivo mapa.txt:

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

Olá! Estou vendo que alguns arquivos estão como ".o" no final. Provavelmente o arquivo que você fez o download. No entanto ele tenta compilar o "pacman.exe" e alguns arquivos ".c". Eu posso estar enganado, mas vou recomendar que você verifique se não está ocorrendo conflito de arquivos, ou seja, se não está tentando compilar os dois tipos de arquivos ao mesmo tempo. Caso não seja isso, vou te pedir que deixe um link pra acessar o seu arquivo especificamente, para que possa acessá-lo.

Olá Ezequiel, criei outro projeto e fiz Ctrl C e Ctrl V dos arquivos deixados pelo professor(fogefoge.h, fogefoge.c, mapa.h, mapa.c e mapa.txt). E agora o projeto está rodando graças a sua ajuda. Muito obrigada pela sua ajuda e atenção!!!!!!

Ah que bom! Fico feliz por ter ajudado. Abraço Luiza.