2012-12-24 3 views
2

구조체 유형 ObjectLink의 배열을 보유하는 table (구조체)에 객체를 삽입하려고하면이 메시지가 나타납니다. 구조체 :C++ : '->'의 잘못된 유형 인수

typedef struct ObjectLink { 
    void *key; 
    struct Object *next; 
} ObjectLink; 

typedef struct Object { 
    void *key; 
    ObjectLink *top; 
} Object; 

typedef struct Table{ 
    ObjectLink *linkedObjects; 
    int size, originalSize; 
    HashFcn hfun; 
    PrintFcn pfun; 
    ComparisonFcn fcomp; 
} Table; 

코드 (모든 할당 & 문 경우에) 실패 :

Boolean InsertObject(TableP table, ObjectP object) 
{ 

    int i = table->hfun(object, table->size); 
    if (table->linkedObjects[i]->key == NULL) 
    { 
     table->linkedObjects[i]->key = object; 
    } else 
    { 
     table->linkedObjects[i]->next->key = object; 
    } 

    return TRUE; 
} 

나는 previous questions에서 검색 한하지만 도움이되지 않았다. 여기서 뭐가 잘못 됐니?

답변

4

linkedObjects이 포인터이기 때문에 linkedObjects[i]이 개체입니다. -> 연산자는 포인터에서만 작동합니다. 당신이 struct이있을 때, 당신은 필드 액세스에 대한 일반 도트 연산자 .를 사용해야합니다 : E1[E2] == *((E1)+(E2)) :

table->linkedObjects[i].key = object; 
//      ^--- Here 
+0

그럼 왜 구조체가 아닌 포인터가 아니라 포인터가 호출되지 않습니다 : table.linkedObjects [i] .key – Tom

+1

@Tom'table'은 유형이 TableP입니다. 표시되지 않습니다. 정의에서; 그러나'P'는 아마도'포인터 '를 의미합니다. – dasblinkenlight

3

배열 첨자 연산자 []는 다음과 같이 정의된다. ->을 사용하면 연산자 []로 포인터를 이미 참조 해제했기 때문에 존재하지 않는 포인터를 역 참조하려고합니다. 그래서 적합한 솔루션입니다 : 대신

table->linkedObjects[i].next->key = object; 

:

table->linkedObjects[i]->next->key = object; 

linkedObjects[i]

유형 ObjectLink, 그것은 역 참조 할 필요이다.