Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

jony17

Programa com varios ficheiros

Mensagens Recomendadas

jony17

Boa tarde!

Cria dividir um ficheiro em vários módulos mas estou com alguns problemas.

Tenho os seguintes ficheiros:

main.c  -> onde tenho a funcao main

funcoes.c

funcoes.h

comandos.c

comandos.h

Onde tenho que definir por exemplo uma struct ou fazer um #define MAX?

Nos ficheiros .h é so por os cabeçalhos das funcoes nao é ?

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nram

Mesmo a calhar.

Bem, o que me está a acontecer é que por exemplo declaro num header file qualquer por exemplo as structs, com os seus typedefs, o que acontece, é que por exemplo, imaginemos que no ficheiro.c tenho funções que recebem ou retornam algo do tipo "struct". Qualquer desses tipos dá erro ao tentar compilar com o "make"... ou seja:

Imaginemos que no ficheiroStructs.h tenho: typedef struct x { int .... } XXX;

E no ficheiroFuncs.c chamo o ficheiroStructs.h claro, e o seu header file ficheiroFuncs.h (onde tem as funcs declaradas), e neste ficheiroFuncs.h dá erro dizendo:

xxx.h:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token

xxx.h:6: error: expected ‘)’ before ‘*’ token

xxx.h:7: error: expected ‘)’ before ‘*’ token

Compilaçao uso isto:

gcc -Wall -l readline *.c *.h -o demo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nram

typedef struct sEntidade {
struct sONomes	 *nome;												//Apontador da struct sNomes
int 	         nCont;												//Numero de Contribuinte
LIG 			 *ligA;												//Busca IDs das Ligações
LIG 			 *ligF;												//Busca IDs das Ligações
LIG 			 *ligP;												//Busca IDs das Ligações
MP 				 *sms;												//Busca mensagens
struct sEntidade *next;
} ENT, *ENTIDADE;

typedef struct sONomes {
char 			  nome[TAMNOME];									//Nome da "Entidade"
struct sENDNomes  *endEN;											//Apontador para a struct que tem os NIFs dos nomes iguais
struct sONomes    *next;
} ONOMES;

Tem mais mas isto chega....

Declaração no ficheiro.h

Apenas as linhas que dão conflito.

ONOMES *inserirHashNome (ENT *ent);
int addLig (ENT *end1, ENT *end2, int tipo, int peso);
int adicionaLig(ENT *end1, ENT *end2, int tipo, int peso);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DVD

Nos ficheiros .h podes definir variáveis, cabeçalhos de funções, contantes, etc.

O que está a bold é verdadeiro mas nunca deves fazer tal coisa! A não ser claro em casos especificos

typedef struct sEntidade {
        struct sONomes         *nome;   
}

Para que é que mete o struct aqui?

Basta fazeres :

typedef struct sEntidade {
        sONomes         *nome;   
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nram

Mostra a makefile sff.

O meu make está mal. Não sei ainda como se faz o make, visto que eu posso ter milhares de ficheiros dependentes uns dos outros. :S

CC=gcc
CFLAGS=-Wall -l readline
SRC = *.h *.c

redesocial : ${SRC}
$(CC) $(CFLAGS) $(SRC) -o demo

clean :
rm ${OBJS}
rm demo

O que está a bold é verdadeiro mas nunca deves fazer tal coisa! A não ser claro em casos especificos

typedef struct sEntidade {
        struct sONomes         *nome;   
}

Para que é que mete o struct aqui?

Basta fazeres :

typedef struct sEntidade {
        sONomes         *nome;   
}

Meto struct sONomes pois foi assim que (sempre) fiz/aprendi, quando pretendo ligar a outra struct. Posso apenas introduzir sONomes que o compilador "deduz"? :S

No .h correspondente tenho as structs declaradas, e depois noutros ficheiros .c / .h que necessito apenas faço o include do .h (das structs) no(s) ficheiro(s) .c ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Tentei fazer um exemplo de acordo com o que tinhas dito acerca da tua estrutura de ficheiros:

//ficheiroStructs.h

#ifndef FICHEIROSTRUCTS_H
#define FICHEIROSTRUCTS_H

typedef struct x {
int b;
} XXX;

#endif

//ficheiroFuncs.h

#ifndef FICHEIROFUNCS_H
#define FICHEIROFUNCS_H

void funcao(XXX);

#endif

#include <stdio.h>

#include "ficheiroStructs.h"
#include "ficheiroFuncs.h"

int main(void) {
       XXX a;
       a.b = 3;
       funcao(a);
       return 0;
}

void funcao(XXX a) {
       printf("%d\n",a.b);
}

CC=gcc
FLAGS=-Wall -Wextra -g -pedantic -std=c99 -O3

main : ficheiroFuncs.o
$(CC) $(FLAGS) -o main ficheiroFuncs.o

ficheiroFuncs.o : ficheiroFuncs.c ficheiroFuncs.h ficheiroStructs.h
$(CC) $(FLAGS) -c ficheiroFuncs.c

./main
3

Vê se ajuda.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nram

acho que percebi. Mas imagina que eu tenho 10 ou 20 ficheiros ou 1000 ou quantos quiser, com dependências, eu no make tenho sempre que definir essas dependências? (nem que seja dependente sempre do "mesmo" ficheiro" ?)

EDIT: Já percebi isso do make. Só me falta saber se existe alguma maneira mais simples para "fazer a cena das dependências" ...

Obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DVD

Tens o switch -I que recebe uma path para o compilador procurar ficheiros ;)

Por ex:

PATH1 = ~/mylib/etc/

gcc -I$(PATH1) -o fice.o file.c

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nram

bem, com base no que percebi do baderous explicou, fiz o meu make, e está a compilar em condições.

Agora a questão é: dá para simplificar? ou para melhorar mais coisas?

Aqui fica ele:

CC=gcc
CFLAGS=-Wall -l readline
OBJS= auxiliares.o testes.o inserir.o remover.o escrever.o interface.o pesquisa.o backup.o redesocial.o


redesocial : ${OBJS}
$(CC) $(CFLAGS) -o redesocial $(OBJS)
redesocial.o : redesocial.c redesocial.h interface.h auxiliares.h
$(CC) $(CFLAGS) -c redesocial.c
auxiliares.o : auxiliares.c auxiliares.h testes.h
$(CC) $(CFLAGS) -c auxiliares.c
testes.o :  testes.c testes.h auxiliares.h
$(CC) $(CFLAGS) -c testes.c
inserir.o : inserir.c inserir.h redesocial.h auxiliares.h pesquisa.h interface.h
$(CC) $(CFLAGS) -c inserir.c
remover.o : remover.c remover.h redesocial.h pesquisa.h testes.h
$(CC) $(CFLAGS) -c remover.c
interface.o : interface.c interface.h remover.h redesocial.h pesquisa.h testes.h inserir.h auxiliares.h backup.h
$(CC) $(CFLAGS) -c interface.c
pesquisa.o : pesquisa.c pesquisa.h redesocial.h escrever.h inserir.h
$(CC) $(CFLAGS) -c pesquisa.c
escrever.o : escrever.c escrever.h redesocial.h pesquisa.h remover.h inserir.h auxiliares.h
$(CC) $(CFLAGS) -c escrever.c
backup.o : backup.c backup.h redesocial.h inserir.h escrever.h
$(CC) $(CFLAGS) -c backup.c
clean:
rm -rf *.o

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.