これは私のコードです。私はCとポインタにはかなり新しいので、おそらくポインターに関する間違いです。ジェネリック型の配列がMaxHeapであるかどうかを調べるアルゴリズム
#include<stdio.h>
#include <stdbool.h>
typedef int (*comparatorPtr)(void*, void*);
bool isMaxHeap(void **heap, int index, int length, comparatorPtr comparator);
/**
* comparator with pointers (the mistake could be here)
*/
int comparator_integer(void* e1, void* e2) {
int i1 = *(int *) e1;
int i2 = *(int *) e2;
//print 2 elements of array/heap
printf("I1 heap: %d\n", i1);
printf("I2 heap: %d\n", i2);
printf("***************************\n");
if (i1 == i2) return 0;
else if (i1 > i2) return 1;
else return -1;
}
/**
* Function for check if the array is or isn't a maxHeap
*/
bool isMaxHeap(void **heap, int index, int length, comparatorPtr comparator) {
if (index > length - 1) return true;
printf("I'm calling comparator 1 \n%d value index1\n",index);
if (length > index * 2 && comparator((heap + index), (heap + (index * 2))) < 0) return false;
printf("I'm calling comparator 2 \n%d value index2\n",index);
printf("Value lenght %d\n", length);
if (length > index * 2 + 1 && comparator((heap + index), (heap + ((index * 2) + 1))) < 0) return false;
printf("I'm calling comparator 3 \n");
if (index == 0) return isMaxHeap(heap, 1, length, comparator) && isMaxHeap(heap, 2, length, comparator);
else return isMaxHeap(heap, index * 2, length, comparator) && isMaxHeap(heap, index * 2 + 1, length, comparator);
}
int main() {
int array[6] = {90, 15, 10, 7, 12, 2}; //maxHeap array
int length = sizeof(array)/ sizeof(array[0]);
int index = 0;
printf("element in position 1: %d\n",*(array + (index*2)+1));
printf("length %d\n", length);
isMaxHeap((void **) &array, index, length, &comparator_integer) ? printf("Yes"): printf("No");
return 0;
}
配列がMaxHeapですが、私のコードは、第 返し、なぜ私はあなたがいけない(printf関数は単にエラーをキャッチしようとするためにここにいる)
おかげ
'void **'はポインタの配列であり、要素の配列ではありません。 – Barmar
'isMaxHeap'は、配列の各要素のサイズを知ってから、ポインタを' char * 'に変換し、インデックスにサイズを乗じて加算する必要があります。 – Barmar