2013-03-06 3 views
2

해시 테이블 내의 모든 키 값 쌍을 반복하고 싶습니다. 따라서 g_hash_table_foreach() 함수를 사용했습니다 (아래 표시된 프로토 타입). 각 키 값 쌍에 대해 void func 메소드를 호출합니다.각 반복 작업 g_hash_table_foreach

void g_hash_table_foreach(GHashTable *hash_table,GHFunc func, 
          gpointer user_data); 

그러나, 내가 필요로하는 기능을 호출 할 때마다, 다시 값을 반환 방법에 대한. I 필요한

void calculate(gpointer key, gpointer value, gpointer userdata) 
{ 
    return calculateNumbers(key, value); 
} 

int total = 0; 
g_hash_table_foreach(mymap, calculate, NULL); 

그 변수의 총 저장 계산() 함수에 의해 수신 된 각각의 리턴 값의 합계 :

는 예를 들어 다음의 코드를 고려한다. 나는 이것을 g_hash_table_foreach 메소드로하기가 어렵다.

나는 while 루프를 가지고 있고, 전체 변수를 외부에 선언하고 각 쌍의 반복마다 값을 증가시킵니다. 그러나 glib가 한 번에 하나씩 키 - 값 쌍을 구성 할 수 있다고 생각하지 않습니다. (GList와 달리 다음 속성을 가짐) 어떻게하면 좋을까요?

답변

5

API가 "사용자 포인터"를 제공하는 이유는 바로이 때문입니다.

static void calculate(gpointer key, gpointer value, gpointer userdata) 
{ 
    int *total = userdata; 

    *total += calculateNumbers(key, value); 
} 

g_hash_table_foreach(mymap, calculate, &total); 

입심와 GTK +의 API : 당신은 예를 들어, 거기 total 변수의 주소가 필요 어떤 데이터 전달 "버릇"나를 떠나있는 사용자 포인터를 제공하는의 아주 좋은을; 콜백을 포함하지 않는 C API를 볼 때마다 (프로그래머가 전역 상태를 사용하도록 강요한다) 나는 싫어한다. 그리고 불평. 가능하다면 수정하십시오.

업데이트 : : 또한 완전성을 위해 GHashTable의 "반복"API를 사용하여 실제로 콜백없이이 작업을 수행 할 수 있습니다.

g_hash_table_iter_init()g_hash_table_iter_next() 기능을 참조하십시오. 최소한 glib 버전 2.16 이상이 필요합니다.

+0

고맙습니다. 작동합니다. =) API가 아직 없습니다. 다시 한번 감사드립니다 :) – Goaler444