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

Vnepomuceno

Problema com Listas

11 mensagens neste tópico

Bom dia!

Estou com o seguinte problema com listas: preciso de uma estrutura de dados que consiste numa lista de uma certa estrutura X, em que um dos elementos dessa estrutura X é ele mesmo, uma outra lista. O meu problema é que na definição deste tipo, não sei como hei-de fazer, isto porque:

typedef struct {
(...)
list *intf;
} X;

struct _item {
    X *temp;
    struct _item *next;
};

typedef struct _item item;

struct _list {
    item *first;
    int nitem;
};

typedef struct _list list;

O meu principal problema, é que qualquer que seja a ordem a qual eu faça as definições, o compilador há-de sempre acusar erro, porque todas essas 3 estruturas têm elementos umas das outras, mas é assim que me dá jeito que a estrutura "completa" fique.

Alguém tem alguma solução?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cada uma das 3 estruturas que meti em cima, dependem uma das outras, que porventura já estão num header file... Não sei como é que o teu comentário me poderá ajudar, mas ok...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes colocar o erro exacto aqui? É que assim à primeira vista, as "dependências" parece-me estar por ordem e correctas...

O que o pedrosorio provavelmente quis dizer foi que se fizeres um include do próprio ficheiro onde essas estruturas estão, o problema fica resolvido. Pessoal não faria assim, colocava uns typedefs no topo desse ficheiro antes de qualquer definição da estrutura.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em C o compilador corre "de cima p baixo", não podes fazer referencias circulares.

A única maneira de resolver isso é organizar o código de maneira a declarares primeiro o q precisas, e só depois usar referencias a esses tipos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal não faria assim, colocava uns typedefs no topo desse ficheiro antes de qualquer definição da estrutura.

Era isso que eu colocaria no .h

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em C o compilador corre "de cima p baixo", não podes fazer referencias circulares.

Acho que o problema é mesmo esse, estar a fazer referências circulares, já que dessas 3 estruturas, não há nenhuma ordem a qual não haja problema, porque todas dependem de todas. Tive de mudar a "estrutura global", ou seja, criar um tipo de lista diferente, para não haver dependências circulares, e depois usar esses dois tipos de listas em paralelo.

Obrigado pela vossa ajuda :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem lá a pergunta que é bastante simples:

Regra geral, quando pretendemos utilizar o que quer que seja, temos de definir primeiro, certo?

O que acontece se definir duas estruturas como sendo

struct a {

    int valor ;

    struct b * ptr ;

}

struct b {

  int valor1, valor2;

  struct a * ptr ;

}

Se eu fizer isso vai dar um erro de compilação, certo? Porque struct b é utilizada sem estar definida. Parece-me que é disto que estão a falar quando dizem que isto se resolve com os typedefs em cima. Mas, sendo mais concreto, que typedefs seriam necessários neste exemplo?

Tomás

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É para esses problemas que se torna necessário fazer typedefs, neste caso,

typedef struct a aaa;

typedef struct b bbb;

struct a {

    int valor ;

    bbb * ptr ;

}

struct b {

  int valor1, valor2;

  aaa * ptr ;

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah... não sabia que se podia fazer "typedef struct a aaa" antes de definir struct a.

Então se percebo bem, isso funciona exactamente da mesma maneira que os protótipos das funções, certo?

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