2013-06-09 3 views
2

저는 rbtree.h에 정의 된 rb_tree를 사용하는 Linux 커널 프로젝트를 진행하고 있습니다. 나는이 나무의 개체를 검색하기 위해 Red Black Tree in Linux

struct source_store{ 
    sector_t source; 
    sector_t cache; 
    struct rb_node * node; 
} 

다음을 수행

: 컴파일 할 때

struct rb_node * parent = root->rb_node; 
struct source_store * store = rb_entry(parent, struct source_store, node); 

그러나, 나는이 오류가 난 여기 트리에 저장하고있는 구조는 다음과 같다 :

warning: initialization from incompatible pointer type 

또한 원본 및 캐시 필드에 저장하는 숫자는 트리에서 스트럿을 검색 할 때 다릅니다. 예를 들어, 소스 필드에 512를 저장하고 나중에 struct를 검색하면 16810075660910329857과 같이 엄청나게 큰 숫자가됩니다. sector_t는 긴 부호없는 정수입니다. 저장된 번호가 왜 바뀌 었습니까? 포인터 유형이 호환되지 않는 이유는 무엇입니까?

+0

어떻게'struct source_store'를 두 번째 매개 변수로 전달할 수 있습니까? 변수가 아닌 데이터 유형입니다. 또한'rb_entry'의 프로토 타입은 무엇입니까? – user93353

+0

이 자습서에 따라 : http://lwn.net/Articles/184495/, 형식을 전달해야합니다. 프로토 타입은 다음과 같습니다. rb_entry (pointer, type, member); 여기서 member는 포함 구조의 노드 이름입니다. rb_entry는 container_of()의 래퍼 일뿐입니다. –

+0

'rb_entry'는 매크로가 아니라 함수이기 때문입니다. 이것이 rb_entry의 정의 인 질문에이 정보를 제공해야하는 이유입니다. – user93353

답변

6

당신은 정의해야합니다 귀하의 struct source_store 같은 : rb_entry

#define rb_entry(ptr, type, member) container_of(ptr, type, member) 

으로 정의된다 그리고 그것은 단지 몇 가지 간단한 오프셋 계산

#define container_of(ptr, type, member) ({   /
     const typeof(((type *)0)->member) *__mptr = (ptr);/ <--error happens here 
     (type *)((char *)__mptr - offsetof(type,member));}) 

유형의이기 때문이다

struct source_store{ 
    sector_t source; 
    sector_t cache; 
    struct rb_node node; // not a pointer to node 
} 

__mptrstruct rb_node**이고 유형은 ptrstruct rb_node*입니다. 따라서 호환되지 않는 포인터 유형에 대한 경고가 있습니다.

관련 문제