Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

jony17

Programa com varios ficheiros

Recommended Posts

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

Share this post


Link to post
Share on other sites
Localhost

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


here since 2009

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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);

Share this post


Link to post
Share on other 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;   
}

Share this post


Link to post
Share on other 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 ...

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.