2011-12-02 121 views
0

我正在使用開源的映射工具,它有能力使用g_io_add_watch來觀察文件描述符。我正在嘗試觀察stdin文件描述符,並且當stdin接收數據時,我可以成功地調用回調函數。但我無法讀取這些數據。我正在嘗試修改回調函數,以接收開源api的處理程序中描述的信息。void **回調函數的混淆

編輯**我的問題首先是什麼是無效**,在這種情況下它將如何使用。我希望我的回調函數提供參數,這些參數是爲您在下面看到的readUserInput_two函數描述的,我需要將它傳遞到下面描述的回調系統。我很困惑,爲了讓當前的實現能夠通過這些參數,我需要通過我的void **。

它看起來像這樣

readUserInput_two(GIOChannel *ioch, GIOCondition cond, gpointer data) 

我想這個指針存儲到其定義爲

struct callback { 
    void (*func)(); 
    int pcount; 
    enum attr_type type; 
    void *p[0]; 

}; 

在這種用於實例您提供以下參數的回調函數回調

callback_new(void (*func)(void), int pcount, void **p) 

在此調用中,pcount是您參數的數量r函數指針應該有,並且我認爲void ** p或者是那些參數的類型或者類似的東西,但是我似乎無法弄清楚。

當回調被觸發時,它調用一個定義在定義語句中的函數。

#define callback_call_3(cb,p1,p2,p3) callback_call_args(cb, 3, p1, p2, p3) 

該函數被定義爲各種數量的p的ex。 callback_call_1(cb,p1)也存在。任何人都可以解釋如何讓我的回調函數接收這些數據字段。調用callback_call_3的中間回調fire函數看起來像這樣。

static gboolean 
navfocus_call_watch(GIOChannel * iochan, GIOCondition condition, gpointer t) 
{ 
    struct callback *cb=t; 
    if(cb->pcount == 1)//I added this if before it only had callback_call_0 
    { 
     callback_call_0(cb); 
    } 
    else if(cb->pcount == 4) 
    { 
     callback_call_3(cb,iochan,condition,t); 
    } 
    return TRUE; 
} 
+0

我不明白你的問題是什麼,你有什麼嘗試,什麼不行? –

+0

編輯說明更多 –

回答

1

void**爲指針的指針爲void一個類型。

至於如何在你的情況下使用它,你將不得不諮詢文檔。我無法從你發佈的代碼片段中看出來,而且變量名稱「p」也沒有幫助。

編輯:至於您的回調提供您的原始數據,回調函數沒有任何參數。函數如何獲得指針?

Edit2:我明白了,這是用pcount做的。但隨後回調的聲明是錯誤的,因爲它指出回調沒有任何參數...

2

void **是指向void類型數據(無類型)指針的指針。 void *被用作泛型指向任何類型變量的基地址。在這種情況下,void **期望保存多個void *變量。你可以把它作爲void數組來調用。

根據callback_new()發送的參數數量,可以調用各種函數。有些宏是爲了方便而編寫的。

您需要將這些參數嵌入void ** p。可以分配的內存空隙** P陣列如下:

void **p = malloc(10 * sizeof *p); 

你需要將它們嵌入在由被調用的最終功能所需的順序相同。

說3參數函數:

p[0] = &iochan; 
p[1] = &condition; 
p[2] = &t; 

現在發送無效** p來callback_new(theFunctionPointer,3,P);正如你所解釋的那樣,根據參數的數量調用適當的函數。