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

nata79

typedefs e modulos

10 mensagens neste tópico

boas,

preciso de usar um tipo e umas funções que trabalham sobre esse tipo que estão definidos num modulo do programa noutro modulo mas ao fazer include do do ficheiro .h do primeiro modulo no .h do segundo, ao compilar dá-me erro de redefinição de tipos...

alguma forma de dar a volta a esta situação?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deve-te falta uns #ifndef ... #define ... no ficheiro .h.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nunca trabalhei com essas directivas antes... após alguma pesquisa implementei isso mas continuo a receber o mesmo erro na compilação...

vou meter aqui os header files em questão, talvez assim me consigam dar alguma ajuda mais especifica.

#include "includes.h"
#include "comum.h"

#ifndef struct Ac

typedef struct Ac{
char an;
struct Ac * prox;
} * acido;

typedef struct {
acido primeiro;
acido ultimo;
int quantos;
} lacidos;

#endif


char * lerficheiro(char *, char *);
char * lesequtilizador(char *, char *);
int encontraseq(char *, int);
void escreveseq();
void apagaseq(char *);
void insere(lacidos *, char);

#include "includes.h"
#include "comum.h"
#include "seq.h"

typedef struct t{
	char seq[100];
	int reps;
	struct t * prox;
} tupla;

typedef tupla * tuplas;

#ifndef struct Ac

typedef struct Ac{
char an;
struct Ac * prox;
} * acido;

typedef struct {
acido primeiro;
acido ultimo;
int quantos;
} lacidos;

#endif

int nbase(char *);
int acrescenta(tuplas *, char *);
int encontratupla(tuplas, char *);
int contatupletos(char *);
int dnarna(char *);
char * cadeiainversa(char *, int);
void reverse(char *);
int complementar(char *);
int inversa(char *);
void subseq(char *);
void findsubseq(char *);
int auxfindsubseq(FILE *, char *);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas

Experimenta assim:

#ifndef HEADER1_H   // se ainda nao processou este .h

#define HEADER1_H  // define que já foi processado

// código do header


#endif

Assim o header só é processado uma vez (se um segundo ficheiro faz o include deste .h o pré-processador não o volta a processar) e não há "re-declarações".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas

Experimenta assim:

#ifndef HEADER1_H   // se ainda nao processou este .h

#define HEADER1_H  // define que já foi processado

// código do header


#endif

Assim o header só é processado uma vez (se um segundo ficheiro faz o include deste .h o pré-processador não o volta a processar) e não há "re-declarações".

n percebi... podes dar um exemplo disso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

n percebi... podes dar um exemplo disso?

Metes todo o código do ficheiro dentro das macros (onde está '// código do header').

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também podes usar a directiva #pragma once, mas pode não ser compatível com todos os compiladores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

usando a dica Triton

o meu códidogo ficou

#include "includes.h"
#include "comum.h"


#pragma once
typedef struct Ac{
char an;
struct Ac * prox;
} * acido;

#pragma once
typedef struct {
acido primeiro;
acido ultimo;
int quantos;
} lacidos;

char * lerficheiro(char *, char *);
char * lesequtilizador(char *, char *);
int encontraseq(char *, int);
void escreveseq();
void apagaseq(char *);
void insere(lacidos *, char);

#include "includes.h"
#include "comum.h"
#include "seq.h"

typedef struct t{
	char seq[100];
	int reps;
	struct t * prox;
} tupla;

typedef tupla * tuplas;

int nbase(char *);
int acrescenta(tuplas *, char *);
int encontratupla(tuplas, char *);
int contatupletos(char *);
int dnarna(char *);
char * cadeiainversa(char *, int);
void reverse(char *);
int complementar(char *);
int inversa(char *);
void subseq(char *);
void findsubseq(char *);
int auxfindsubseq(FILE *, char *);

e já funciona!!

brigado a todos pela ajuda!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a ideia era

ficheiro exemplo.h

#ifndef EXEMPLO_H   // se ainda nao processou este .h

#define EXEMPLO_H  // define que já foi processado

struct coiso {
    int a;
};

int  funcao( int abc );


#endif

ficheiro exemplo.c

int funcao( int abc )
{
    return abc * 10 - 1;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Funcionou mas depois de ver o teu post fiquei com a impressão que não percebeste porquê (pois usaste dois #pragma once, o que não é necessário - só precisas de um na primeira linha do fichero).

0

Partilhar esta mensagem


Link 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