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

nata79

typedefs e modulos

Mensagens Recomendadas

nata79    0
nata79

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nata79    0
nata79

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 *);

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nata79    0
nata79

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

n percebi... podes dar um exemplo disso?

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nata79    0
nata79

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!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade