2012-06-07 94 views
0

哪種方式最好將S傳遞給GSourceFunc?或者既不?將結構內的結構傳遞給GSourceFunc的最佳方法

typedef struct{ 
//... 
}S; 

struct MS{ 
//.. 
S *St; 
}; 

static gboolean AL_Calback(gpointer data){ 
    S *St = (S*)user_data; 
    St->Something = SomethingElse; 
    return TRUE; 
} 

int main (int argc, char *argv[]){ 

    //... 
    MS *MainStruct = gnew0(MS, 1); 
    Mainstruct->St = gnew0(S, 1); 
    clutter_threads_add_timeout_full(G_PRIORITY_HIGH, 100, AL_Callback, MainStruct->St, NULL); 
    //... 
    } 

或類似這樣的,

typedef struct{ 
//... 
}S; 

struct MS{ 
//.. 
S St; 
}; 

static gboolean AL_Calback(gpointer data){ 
    MS *MV = (MS*)user_data; 
    MV->S.something = SomethingElse;  
    return TRUE; 
} 

int main (int argc, char *argv[]){ 

    //... 
    MS *MainStruct = gnew0(MS, 1); 
    clutter_threads_add_timeout_full(G_PRIORITY_HIGH, 100, AL_Callback, MainStruct, NULL); 
    //... 
    } 

我試過其他的方法,但一直沒能使其發揮作用。 clutter_add_timeout需要將指針作爲參數。

回答

1

如果通過指針傳遞參數到clutter_threads_add_timeout_Full,那麼你可以只通過的MainStructSt構件從而減少動態分配的需要(對於內部結構)的地址。

struct MainStruct{ 
    //.. 
    S St; // note: no pointer 
}; 

// in main 
MainStruct* ms = gnew0(MS, 1); 
clutter_threads_add_timeout_Full(G_PRIORITY_HIGH, 100, AL_Callback, &(ms->St), 
    NULL); 

編輯:更新的代碼動態分配MainStruct結構,以避免可能的段錯誤如所指出的ptomato

+0

'clutter_threads_add_timeout'不會縫讓我過去什麼,但一個gpointer,這其實只是'(無效*)'。 – MVTC

+0

@MVTCplusplus - 然後只需在代碼後忽略該句子。 a)有一個指針成員並傳遞該成員之間沒有區別。和b)有一個struct成員並傳遞它的地址(內存分配除外) – Attila

+0

謝謝。我還沒有做任何測試,但我想你幾乎回答了我的問題。 – MVTC