Vnepomuceno Posted April 26, 2009 at 08:42 AM Report #259123 Posted April 26, 2009 at 08:42 AM 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
pedrosorio Posted April 26, 2009 at 11:07 AM Report #259128 Posted April 26, 2009 at 11:07 AM A solução chama-se Header file Não respondo a dúvidas por mensagem.
Guest id194 Posted April 26, 2009 at 12:20 PM Report #259145 Posted April 26, 2009 at 12:20 PM A solução chama-se Header file LOL!
Vnepomuceno Posted April 26, 2009 at 02:50 PM Author Report #259169 Posted April 26, 2009 at 02:50 PM 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...
Guest id194 Posted April 26, 2009 at 05:02 PM Report #259184 Posted April 26, 2009 at 05:02 PM 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.
bruno1234 Posted April 26, 2009 at 05:30 PM Report #259187 Posted April 26, 2009 at 05:30 PM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
pedrosorio Posted April 26, 2009 at 06:40 PM Report #259195 Posted April 26, 2009 at 06:40 PM 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 Não respondo a dúvidas por mensagem.
Vnepomuceno Posted April 26, 2009 at 08:56 PM Author Report #259229 Posted April 26, 2009 at 08:56 PM 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 👍
Tomás Mendes Posted April 26, 2009 at 10:06 PM Report #259239 Posted April 26, 2009 at 10:06 PM 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
pedrosorio Posted April 26, 2009 at 10:22 PM Report #259242 Posted April 26, 2009 at 10:22 PM É 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 ; } Não respondo a dúvidas por mensagem.
Tomás Mendes Posted April 26, 2009 at 10:44 PM Report #259251 Posted April 26, 2009 at 10:44 PM 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?
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now