C comparacion de array de punteros

Estoy intentando escribir una función para comparar dos matrices de punteros para ver si son iguales. Me gustaría usar la función en cualquier conjunto de punteros, es decir, independientemente de a qué apuntan los punteros, solo me interesa la igualdad de los punteros en sí.

He escrito esto:

/** * 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; } 

Mi prueba de unidad se ve así:

 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)); } 

pero cuando compilo obtengo las siguientes advertencias (no errores):

 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 **' 

con el comstackdor quejándose de que en mi prueba de unidad los tipos que estoy usando no coinciden con el prototipo de función

Pero no estoy realmente interesado en el tipo subyacente, solo el puntero a él. Debería:

  • a) simplemente ignora las advertencias
  • b) reescribir la función de manera que el comstackdor no emita advertencias
  • c) hacer un reparto de los punteros entrantes
  • d) acepte que a C no le gusta la idea de no saber el tipo subyacente y vuelva a escribir la función para cada tipo de puntero que pueda encontrar

Su función requiere (un puntero al primer elemento de) una matriz de const void* .

Está intentando pasarlo (un puntero al primer elemento de) una matriz de Mode* .

Esto no está permitido en C, porque (entre otras razones) ni siquiera está garantizado por el estándar C que void* y Mode* sean del mismo tamaño. De modo que el lenguaje no permite que los progtwigs traten accidentalmente una matriz de una como si fuera una matriz de la otra.

Sujeto a que los detalles específicos de la implementación sean amigables, que están en casi cualquier implementación, podría usar memcmp para comparar los arreglos.