Dúvida programação - error: dereferencing pointer to incomplete type

CoSMiCaL

Power Member
Boa noite, estou a fazer um programa em C que mexe com filas e com threads (programação concorrente) mas está-me a dar o erro: "error: dereferencing pointer to incomplete type". O código é:

Código:
[COLOR=#808080][I]/* queue_element_t */[/I][/COLOR]
[COLOR=#993333]typedef[/COLOR] [COLOR=#993333]struct[/COLOR] queue_element [COLOR=#009900]{[/COLOR]
    [COLOR=#993333]struct[/COLOR] _sthread [COLOR=#339933]*[/COLOR]thread[COLOR=#339933];[/COLOR]
    [COLOR=#993333]struct[/COLOR] queue_element [COLOR=#339933]*[/COLOR]next[COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] queue_element_t[COLOR=#339933];[/COLOR]
 
[COLOR=#808080][I]/* queue_t */[/I][/COLOR]
[COLOR=#993333]typedef[/COLOR] [COLOR=#993333]struct[/COLOR] _queue [COLOR=#009900]{[/COLOR]
  queue_element_t [COLOR=#339933]*[/COLOR]first[COLOR=#339933];[/COLOR]
  queue_element_t [COLOR=#339933]*[/COLOR]last[COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] queue_t[COLOR=#339933];[/COLOR]
 
[COLOR=#993333]void[/COLOR] queue_print[COLOR=#009900]([/COLOR]queue_t [COLOR=#339933]*[/COLOR]queue[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        queue_element_t [COLOR=#339933]*[/COLOR]el [COLOR=#339933]=[/COLOR] queue[COLOR=#339933]->[/COLOR]first[COLOR=#339933];[/COLOR]
        [COLOR=#993333]struct[/COLOR] _sthread [COLOR=#339933]*[/COLOR]thr[COLOR=#339933];[/COLOR]
 
        [COLOR=#b1b100]if[/COLOR][COLOR=#009900]([/COLOR]el [COLOR=#339933]==[/COLOR] NULL[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [COLOR=#b1b100]return[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [COLOR=#b1b100]for[/COLOR][COLOR=#009900]([/COLOR]thr [COLOR=#339933]=[/COLOR] el[COLOR=#339933]->[/COLOR]thread[COLOR=#339933];[/COLOR] el [COLOR=#339933]!=[/COLOR] NULL[COLOR=#339933];[/COLOR] el [COLOR=#339933]=[/COLOR] el[COLOR=#339933]->[/COLOR]next[COLOR=#339933],[/COLOR] thr [COLOR=#339933]=[/COLOR] el[COLOR=#339933]->[/COLOR]thread[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL][COLOR=#009900]([/COLOR][COLOR=#ff0000]" %d,%d"[/COLOR][COLOR=#339933],[/COLOR] thr[COLOR=#339933]->[/COLOR]tid[COLOR=#339933],[/COLOR] thr[COLOR=#339933]->[/COLOR]quantum[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL][COLOR=#009900]([/COLOR][COLOR=#ff0000]"[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR]
 
[COLOR=#993333]struct[/COLOR] _sthread[COLOR=#339933]*[/COLOR] queue_find_tid[COLOR=#009900]([/COLOR]queue_t [COLOR=#339933]*[/COLOR]queue[COLOR=#339933],[/COLOR] [COLOR=#993333]int[/COLOR] tid[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        queue_element_t [COLOR=#339933]*[/COLOR]el[COLOR=#339933];[/COLOR]
        [COLOR=#993333]struct[/COLOR] _sthread [COLOR=#339933]*[/COLOR]thr[COLOR=#339933];[/COLOR]
 
        [COLOR=#b1b100]for[/COLOR][COLOR=#009900]([/COLOR]el [COLOR=#339933]=[/COLOR] queue[COLOR=#339933]->[/COLOR]first[COLOR=#339933],[/COLOR] thr [COLOR=#339933]=[/COLOR] el[COLOR=#339933]->[/COLOR]thread[COLOR=#339933];[/COLOR] el [COLOR=#339933]!=[/COLOR] NULL[COLOR=#339933];[/COLOR] el [COLOR=#339933]=[/COLOR] el[COLOR=#339933]->[/COLOR]next[COLOR=#339933],[/COLOR] thr [COLOR=#339933]=[/COLOR] el[COLOR=#339933]->[/COLOR]thread[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [COLOR=#b1b100]if[/COLOR][COLOR=#009900]([/COLOR]thr[COLOR=#339933]->[/COLOR]tid [COLOR=#339933]==[/COLOR] tid[COLOR=#009900])[/COLOR]
                        [COLOR=#b1b100]return[/COLOR] el[COLOR=#339933]->[/COLOR]thread[COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [COLOR=#b1b100]return[/COLOR] NULL[COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR]

Esse erro é apontado duas vezes para a linha

Código:
printf(" %d,%d", thr->tid, thr->quantum);

e uma para a linha

Código:
if(thr->tid == tid)

O código da struct _sthread é:

Código:
[COLOR=#993333]struct[/COLOR] _sthread [COLOR=#009900]{[/COLOR]
  sthread_ctx_t [COLOR=#339933]*[/COLOR]saved_ctx[COLOR=#339933];[/COLOR]
  sthread_start_func_t start_routine_ptr[COLOR=#339933];[/COLOR]
  [COLOR=#993333]long[/COLOR] wake_time[COLOR=#339933];[/COLOR]
  [COLOR=#993333]int[/COLOR] join_tid[COLOR=#339933];[/COLOR]
  [COLOR=#993333]void[/COLOR][COLOR=#339933]*[/COLOR] join_ret[COLOR=#339933];[/COLOR]
  [COLOR=#993333]void[/COLOR][COLOR=#339933]*[/COLOR] args[COLOR=#339933];[/COLOR]
  [COLOR=#993333]int[/COLOR] tid[COLOR=#339933];[/COLOR]
  [COLOR=#993333]int[/COLOR] nice[COLOR=#339933];[/COLOR]
  [COLOR=#993333]int[/COLOR] priority[COLOR=#339933];[/COLOR]
  [COLOR=#993333]int[/COLOR] quantum[COLOR=#339933];[/COLOR]
  [COLOR=#993333]int[/COLOR] rem_quantum[COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][COLOR=#339933];[/COLOR]

Alguém me pode ajudar a detectar o que está mal nestas linhas e o que precisa de ser mudado?
wallbash.gif


Obrigado!
 
SO ftw.

cheira-me que te falta um include antes da definição de queue_element, header esse que define a _thread (não apenas a declaração).

deves ter a declaração, mas falta a definição, ou seja ele no queue_elemente sabe que existe o tipo _sthread mas não sabe como é definido, daí dar esse erro sempre que tentas aceder a um elemento da _sthread.
 
Hmm, mas eu neste ficheiro, tenho um include para o .h e lá no .h tem um include para o ficheiro que tem a definição da struct _sthread. O que falta então para que ele não dê este erro? Não percebi bem...
 
basicamente esse erro acontece quando o compilador conhece um tipo mas não sabe como é definido (ou seja não sabe quantos bytes deve guardar para ele).

agora só vendo como é que tens os ficheiros organizados é que dá para ver o que está mal. até podes ter os headers com a definição de _sthread bem, mas dentro da _sthread há tb os tipos sthread_ctx_t e sthread_start_func_t que se calhar não tem link para a definição.

vê se o teu .c com esses algoritmos têm acesso atraves dos headers á definição (não chega só a declaração) de todos esses tipos.

EDIT: em último caso linka os headers todos que precisas no .c, não há problema nenhum em fazer isso, a maravilha dos #defines nos headers resolve qualquer problema de re-declaração.
 
Última edição:
Back
Topo