0

Sを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は、引数としてポインターを取る必要があります。

4

1 に答える 1

1

パラメータをclutter_threads_add_timeout_Fullviaポインタに渡す場合は、のStメンバーのアドレスを渡すだけでMainStruct、動的割り当ての必要性を減らすことができます(内部構造の場合)。

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によって指摘された可能性のあるセグメンテーション違反を回避するために構造を動的に割り当てるようにコードを更新しました

于 2012-06-07T19:11:38.583 に答える