2012-06-07 8 views
0

S를 GSourceFunc로 가져 오는 가장 좋은 방법은 무엇입니까? 아니면 둘 다?struct 내에서 구조체를 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에 매개 변수를 전달하는 경우 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); 

편집 :

+0

'clutter_threads_add_timeout' 날 정말 그냥하는 gpointer하지만 아무것도 전달할 수 있도록 솔기하지 않습니다 ptomato 지적 동적으로 가능 세그먼트 폴트를 방지하기 위해 MainStruct 구조를 할당하는 코드 업데이트 '(void *)'. – MVTC

+0

@MVTCplusplus - 코드 다음의 문장을 무시하십시오. a) 포인터 멤버가 있고 그것을 통과시키는 것 사이에는 차이가 없습니다. 및 b) 구조체 멤버가 있고 해당 주소를 전달합니다 (메모리 할당 차이 제외) – Attila

+0

감사. 나는 아직 시험을 보지 않았지만 당신이 제 질문에 거의 대답했다고 생각합니다. – MVTC