2015-04-24 47 views
0

我嘗試使用多線程來完成一個項目,但我不太熟悉void *以及如何使用它。 我有此功能的問題:解除引用'void *'指針並強制轉換不起作用

void *find_way_out(void *tree) 
{ 
    int i; 
    t_tree *tmp; 
    t_tree **road; 
    int j; 
    int th_nbr; 

    th_nbr = tree->thread_nbr; 
    j  = 0; 
    road = xmalloc(sizeof(t_tree)); 
    i  = 0; 
    tmp  = (t_tree *)tree; 
    road[j] = tmp; 

    tmp->visited[th_nbr] = 1; 

    while (1) 
    { 
    while (tmp->leaf[i] != NULL) 
    { 
     printf("room : %s && room next %s\n", tmp->room, tmp->leaf[i]->room); 
     if (tmp->leaf[i]->visited[th_nbr] == 0) 
     { 
     road[++j]   = tmp; 
     tmp     = tmp->leaf[i]; 
     tmp->visited[th_nbr] = 1; 
     i     = -1; 
     printf("going to room-> %s\n", tmp->room); 
     } 

     if (tmp->type == END) 
     { 
     printf("find end...\n"); 
     pthread_exit(&j); 
     } 
     i++; 
    } 
     tmp = road[j]; 
     if (--j == -1) 
     pthread_exit(0); 
     i = 0; 
     printf("backing to room %s\n", tmp->room); 
    } 
    pthread_exit(0); 
} 

的錯誤是在行: th_nbr = tree->thread_nbr;

thread_nbr是我的結構樹中的一個整數。

我編譯時有這些錯誤:

sources/find_way.c:21:16: warning: dereferencing ‘void *’ pointer 
    th_nbr = tree->thread_nbr; 
       ^
sources/find_way.c:21:16: error: request for member ‘thread_nbr’ in something not a structure or union 

你有一個想法解決它? 謝謝。

+4

「......並且演員不工作」 - 你的演員在哪裏? – Mat

+0

指定void *樹到適當的結構,然後嘗試使用它。 –

+0

你正在泄漏'路'。 –

回答

1

您需要先施放。

void *find_way_out(void *p_tree) 
{ 
    int  i; 
    t_tree *tree = (t_tree*) p_tree; 
    t_tree *tmp; 
    t_tree **road; 
    int  j; 
    int  th_nbr; 

    th_nbr = tree->thread_nbr; 

注意:在這裏,我將void指針重命名爲p_tree

2

在你的情況下,在提領時,

th_nbr = tree->thread_nbr; 

treevoid *類型。

您需要

th_nbr = tmp->thread_nbr; //tree changed to tmp 

使移動

tmp = (t_tree *)tree; 

,在提領點,tmptree類型的指針。

0

取消引用void *第一,爲tmp 然後再也沒有引用tree,始終使用tmp

這個問題來自於嘗試解引用void *,就好像它將 定義爲指向t_tree結構的指針。

+0

爲什麼你將純文本標記爲代碼?它不適用於這種用法,你知道...... –