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

Erro: undefined reference to 'WinMain@16'

Estou usando a IDE CodeBlocks e ao tentar rodar o programa aparece a mensagem de erro acima. Como resolver? Eis o meu código.

fogefoge.c

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


MAPA m;
/* A struct consta no fogefoge.h e foi renomeada
pelo typedef Neste caso a estrutura tem um char matriz
um int linhas e um int colunas.
Dessa forma, para apontar as variáveis dentro
da struct basta colocar o nome dado que aqui
é "m" e ponto(.)*/


void move(char direcao) {
// acha a posição do foge foge
    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){
    // move o foge foge
        case 'a':
            m.matriz[x][y-1] = '@';
            break;
        case 'w':
            m.matriz[x-1][y] = '@';
            break;
        case 'd':
            m.matriz[x][y+1] = '@';
            break;
        case 's':
            m.matriz[x+1][y] = '@';
            break;

    // neste momento há 2 foge foge no mapa
    }

    m.matriz[x][y] = '.';
    // transforma um dos foge foge em vazio, neste caso ponto(.).
}


int acabou(){
    return 0;
}

int main() {

    lemapa(&m);

    do {

    imprimemapa(&m);

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

    }while(!acabou());

    liberamapa(&m);



}

fogefoge.h

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

mapa.h

struct mapa {
    /*struct é um conjunto de variáveis que pode abrigar
    tipos primitivos diferentes */
    char** matriz;
    /* declara uma matriz. Como se trata de um ponteiro
    de um ponteiro é preciso colocar dois asteriscos. */

    int linhas;
    int colunas;
};

typedef struct mapa MAPA;

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

mapa.c

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


/*o parâmetro MAPA* m é usado nas funções
como ponteiro para "pegar" a struct que está
declarada em outro arquivo c, o fogefoge.c */

/*para apontar o endereço de memória basta
colocar o asterisco antes do m., então ficaria,
por exemplo, *m.linhas. Contudo, quando pegamos
um ponteiro de uma struct há um atalho na linguagem
C, que é o "->", então, neste caso, basta colocar
m->linhas, isto indica que é um ponteiro de uma
struct
*/


void liberamapa(MAPA* m) {

    for(int i = 0; i < m->linhas; i++) {
    /* Sempre que se fizer a alocação de memória é preciso liberá-la.
    Como se trata de uma matriz. Primeiro libera-se as linhas */

        free(m->matriz[i]);
    }
    free(m->matriz);
    /* liberação de memória das colunas.*/
}

void alocamapa(MAPA* m) {

    m->matriz = malloc(sizeof(char*) * m->linhas);
    /* O malloc faz a alocação dinâmica da memória quando não se sabe o valor exato
    que se vai utilizar. O sizeof calcula automaticamente quantos bytes
    serão necessários. Neste caso, aloca-se primeiro o número de linhas.
    O asterisco no char é para indicar que se está pegando de um ponteiro
    de ponteiro. */

    for (int i = 0; i < m->linhas; i++) {
        m->matriz[i] = malloc(sizeof(char) * (m->colunas + 1));
    /* Com essa instrução se aloca o número de colunas. O +1 é por causa do /0 */
    }
}

void lemapa(MAPA* m) {

    FILE* f;
    // o tipo FILE* é um ponteiro especial para um arquivo

    f = fopen("mapa.txt", "r");
    /* o fopen abre o arquivo solicitado e recebe como
    parâmetro o nome do arguivo e o tipo de abertura*/

    if(f == 0) {
        printf("Erro na leitura do mapa\n");
        exit(1);
    // Este if é caso o arquivo seja igual a zero aparecerá uma mensagem de erro
    }

    fscanf(f, "%d %d", &(m->linhas), &(m->colunas));
    /* Este código vai buscar o número de linhas e colunas do mapa.txt e colocar
    nas variáveis linhas e colunas. É necessário o símbolo de "&" porque o que
    se busca é o endereço de memória. */

    alocamapa(m);

    for (int i = 0; i < 5; i++) {
        fscanf(f, "%s", m->matriz[i]);
    /* fscanf lê as linhas de um arquivo e tem como parâmetros a variável escolhida
    para abrir o arquivo, no caso "f", a máscara da variável onde se quer guardar
    a linha e o nome da variável. Se for array basta colocar o nome se for matriz
    colocar o nome[]*/
    }

    fclose(f);
    // fechamento do arquivo.
}

void imprimemapa(MAPA* m) {
// imprime o mapa.
    for (int i=0; i <5; i++) {
        printf("%s\n", m->matriz[i]);
    }
}
1 resposta
solução!

Quando não há projeto, o Code :: Blocks só compila e vincula o arquivo atual. Para compilar e vincular os dois arquivos de origem, você precisará fazer isso manualmente ou adicioná-los ao mesmo projeto.

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