2012-07-10 2 views
2

두 포인터 배열을 비교하여 함수가 같은지 확인하려고합니다. 나는 즉 관계없이 포인터가 가리키는 파일의 포인터의 배열 기능을 사용하고 싶습니다 - 내가이 작성한 자체C 배열의 포인터 배열 비교

포인터의 평등에만 관심이있어 :

/** 
* Return true if arrays (of type ptr to ptr) are equal 
*/ 
bool ptr_array_eq(const void **x, const void **y, size_t n) 
{ 
    size_t i; 
    for (i=0; i<n; i++) { 
     if (x[i] != y[i]) { 
      return false; 
     } 
    } 
    return true; 
} 

void testPTR_ARRAY_EQ(void) 
{ 
    Mode *m1, *m2, *m3, *m4, *m5, *m6; 

    Mode *a[] = {m1, m2, m3, m4, m5}; 
    Mode *b[] = {m1, m2, m3, m4, m5}; 
    Mode *c[] = {m2, m3, m4, m5, m6}; 
    Mode *d[] = {m1, m3, m4, m5, m6}; 

    CU_ASSERT(ptr_array_eq(a, a, 4)); 
    CU_ASSERT(ptr_array_eq(a, b, 4)); 
    CU_ASSERT(! ptr_array_eq(a, c, 4)); 
    CU_ASSERT(! ptr_array_eq(a, d, 4)); 
} 

을하지만 난 컴파일 할 때 나는 다음과 같은 경고 (오류가) 수 :

내 단위 테스트는 다음과 같습니다

test_utility.c: In function ‘testPTR_ARRAY_EQ’: 
test_utility.c:648:5: warning: passing argument 1 of ‘ptr_array_eq’ from incompatible pointer type [enabled by default] 
../src/glamdring2.h:327:6: note: expected ‘const void **’ but argument is of type ‘struct Mode **’ 

컴파일러가 내 단위 테스트에서 사용중인 유형이 함수 프로토 타입과 일치하지 않는다고 불평하는 경우

하지만 실제로는 기본 유형에만 관심이 없습니다. 내가해야 :

  • A) 단지)) 컴파일러가 경고를
  • C를 발행하지 만드는 방식으로 기능을 다시 들어오는 포인터의 일부 캐스트
  • 라 할) 경고를
  • B를 무시 C가 기본 유형을 모르는 아이디어를 좋아하지 않고 받아 들일 수있는 포인터 유형마다 함수를 다시 작성하십시오.

답변

3

함수에 (다음 요소의 첫 번째 요소에 대한 포인터가 필요합니다.) const void*.

Mode*의 배열 (의 첫 번째 요소에 대한 포인터)을 전달하려고합니다.

(다른 이유로도) 과 Mode*이 같은 크기라는 C 표준에 의해 보증되지 않기 때문에 C에서는 허용되지 않습니다. 그래서 언어는 프로그램이 우연히 하나의 배열을 다른 배열처럼 취급하지 못하게합니다.

구현과 관련된 세부 정보가 매우 친숙한 관계로 어떤 구현 에나 적용되는 경우 memcmp을 사용하여 배열을 비교할 수 있습니다.

+1

+1 : 다음은 표준을 인용 한 또 다른 관련 답변으로 [link] (http://stackoverflow.com/a/1241314/1336150)입니다. –

+0

ok 내 생각에 모든 포인터가 같은 크기 여야합니다.이 경우에는 포인터를 비교하는 일반적인 함수가 불가능하다는 것을 알 수 있습니까? – bph

+0

@Hiett 매크로로 쓸 수 있습니다. –