2012-07-10 78 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 **’ 

與編譯器抱怨說,在我的單元測試我使用的類型不匹配函數原型

但我沒有真正感興趣的底層類型,只有它的指針。我應該:

  • 一)只是忽略警告
  • B)重寫功能的方式,以使編譯器不會發出警告
  • c)採取傳入指針的一些投
  • d)接受C不喜歡不知道底層類型的想法,並重新編寫我可能遇到的每種類型的指針的函數

回答

3

您的函數需要(指向第一個元素的指針)數組const void*

你試圖通過它(一個指向第一個元素的指針)的數組Mode*

這在C中是不允許的,因爲(除其他原因外),它甚至不被C標準保證void*Mode*是相同的大小。因此,該語言不會讓程序意外地將一個數組看作是另一個數組。我們可以使用memcmp來比較數組。

+1

+1:這是[鏈接](http://stackoverflow.com/a/1241314/1336150)引用標準的另一個相關答案。 – 2012-07-10 08:35:31

+0

好吧,所以我認爲所有的指針應該是相同的大小是不正確的,我可以看到在這種情況下,比較指針的通用函數是不可能的? – bph 2012-07-10 08:36:06

+0

@Hiett你可以把它寫成一個宏:) – 2012-07-10 08:36:34