2012-03-20 2 views
9

나는 C를 배우고 C에서 링크드리스트의 조잡한 구현을 시도하고있다. long story short 나는 void 포인터 (요소)와 다음 노드에 대한 또 다른 포인터를 포함하는 구조체가있다. (따라야 할 코드) 헤드 노드와 다른 노드를 새로운 함수로 전달할 때 두 요소가 같은 유형인지 확인하는 방법이 있습니까? 두 노드는 모든 종류의 데이터를 보유 할 수 있어야합니다. Ive는 sizeof()와 비교를 시도했지만 void 포인터를 무시할 수 없습니다. 미리 감사드립니다!C에서 동일한 유형을 선언하기 위해 두 개의 void 포인터를 비교하는 방법이 있습니까?

이 노드에 대한 코드입니다 는
struct Node{ 
    void* element; 
    struct Node* next; 
} 

, 난 그냥 같은 요소 유형 모두와 함께 링크 된 목록을 보장하기 위해 어설과 비교하는 방법이 필요합니다! 감사!

+1

실제로 노드에서 다른 유형을 허용하는 데 큰 문제는 없습니다. 나는 그것을 실제로 사용하는 것을 보지 못했지만, 정말로 코드를 쓰는 사람이 정말로 원하지 않는 한 이상한 일을하지 않도록 호출 코드를 신뢰합니다. – Corbin

+0

당신은'if (a-> element == b-> 요소) {/ * 같은 타입 * /} else {/ * 같은 타입이 아닐 수도 있습니다 * /}': P –

+1

만약 그것이 같은 장소에 대한 포인터라면 기억에? 그건 아주 무의미한 것 같습니다. – Corbin

답변

8

아니요 - 일반적으로 이와 같은 디자인은 피하고 싶지만 실제로 피할 수없는 경우 일반적으로 노드에 열거 형을 넣어서 포함 된 데이터 유형을 알려야합니다.

+0

데이터 형에 대해 구조체 내부에서 열거 형을 사용하는 것에 대해 더 자세히 알려주시겠습니까? – vidit

+2

기본적으로'enum types {T_CHAR, T_SHORT, T_INT, T_LONG, T_FLOAT , T_DOUBLE};'(당신이 신경 쓰는 다른 타입의 이름을 가지고) 저장하고있는 타입에 해당하는 값을 설정하십시오. 큰 문제는 이것을 확장하는 것입니다 (여러분이 추가 할 때마다'enum'을 편집해야합니다) (일반적으로) switch 문이 필요하다. switch (type) {case T_CHAR : use_char ((char) x.value); case T_SHORT : use_short ((short) x.value);/* ... * /}' –

+3

더 좋은 방법은 필요한 타입마다'typedef struct {enum type type; int i;} integer;'와 같은 것을 사용하는 것입니다 ('enum type'은 고유 값을 정의합니다 각각의'struct'에 대해) 원시 정수 대신에이 타입들을 사용합니다 - 그러나 여러분은 기술적으로'void *'를 사용하지 않고'enum t ype *'를 사용하면 명시 적으로 지정할 수도 있습니다. 이 방법을 선택하면 매크로가 합법적 인 국가에 거주하는 경우 몇 개의 매크로 (또는 x- 매크로)를 반복하여 사용할 수 있습니다. –

1

void *는 정확하게 타입없는 포인터입니다. 다른 말로하면, 여러분의 프로그램이 알고있는 것은 그것이 모두에 대한 포인터라는 것입니다. 이것은 유용하지만, 구체적으로 (의도적으로) 당신이 찾고있는 것이 아닙니다.

관련 문제