1
resposta

codeblocks e possivel compilar dois arquivos .C ?

fogefoge.c

#include <stdio.h>

#include <stdlib.h>

#include "fogefoge.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] = '.'; } 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.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 = malloc(sizeof(char) * m->linhas); for(int i = 0; i < m->linhas; i++) { m->matriz[i] = 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);

1 resposta

Olá Sergio

Na opção Project na barra superior do CodeBlocks, vá na opção Properties. Na janela que foi aberta clique na aba Build targets, nessa aba verifique se todos os seus arquivos estão marcados (fogefoge.c, fogefoge.h, mapa.c, mapa.h), se eles estiverem todos marcados o CodeBlocks vai compilar eles normalmente.

Analisando o código notei a ausência de alguns detalhes que são essenciais para funcionamento do programa.

No arquivo mapa.h faltou colocar a função imprimemapa, isso não impede o funcionamento do programa, porem é uma boa pratica já que todas as outras funções estão lá.

void imprimemapa(MAPA* m)

A outra questão nessa parte do programa, você está trabalhando com o ponteiro do MAPA então a função alocamapa também deve receber um MAPA* m

void alocamapa(MAPA* m);

Relacionado também a ponteiro, a nossa matriz deve ser declarada como ponteiro de ponteiros de char ficando char**

char** matriz;

Então o arquivo mapa.h ficou assim:

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)

Agora no mapa.c devemos modificar a função liberamapa da mesma maneira que fizemos no arquivo mapa.h:

void liberamapa(MAPA* m)

Dessa maneira ela vai poder receber o ponteiro para o Mapa.

Na função alocamapa precisamos utilizar o sizeof de um ponteiro de char, ficando assim sizeof(char *), precisamos que seja assim já que essa linha não vai guardar char e sim um ponteiro para os char.

    m->matriz = malloc(sizeof(char* ) * m->linhas);

Sua função vai ficar dessa maneira:

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

Fazendo essa configuração no CodeBlocks e efetuando essas modificações seu programa deve funcionar normalmente, mas qualquer duvida estou a disposição.

Bons Estudos.