Jump to content

Programa com varios ficheiros


jony17
 Share

Recommended Posts

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

Link to comment
Share on other sites

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

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

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

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 ...

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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
Link to comment
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
 Share

×
×
  • Create New...

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.