C 调整堆函数导致索引范围断言失败

C 调整堆函数导致索引范围断言失败,c,heap,C,Heap,我已经构建了一个调整堆函数,但是我的断言(positionsize)失败了,我不知道为什么 void adjustHeap(DynamicArray* heap, int max, int pos, compareFunction compare) { // FIXME: implement int leftChild = 2 * pos + 1; int rightChild = 2 * pos + 2; int idxSmallest = indexSmall

我已经构建了一个调整堆函数,但是我的
断言(positionsize)
失败了,我不知道为什么

void adjustHeap(DynamicArray* heap, int max, int pos, compareFunction compare)
{
    // FIXME: implement
    int leftChild = 2 * pos + 1;
    int rightChild = 2 * pos + 2;
    int idxSmallest = indexSmallest(heap, leftChild, rightChild);
    if(rightChild < max) { /* we have two children */
        if(dyGet(heap, pos) > dyGet(heap, idxSmallest)) {
            dySwap(heap,pos,idxSmallest);
            adjustHeap(heap, max, idxSmallest, compare);
        }
    }
    else if (leftChild < max) { /* we have one child */
        if(dyGet(heap, pos) > dyGet(heap, leftChild)) {
            dySwap(heap,pos,leftChild);
            adjustHeap(heap, max, leftChild, compare);
        }
    }
    else {
        return;
    }
}
我的
assert(positionsize)
使用以下测试在
dyGet()
中失败:

void testAdjustHeap(CuTest* test)
{
    const int n = 100;
    Task* tasks = createTasks(n);
    for (int j = 0; j < n; j++)
    {
        DynamicArray* heap = dyNew(1);
        for (int i = 0; i < n; i++)
        {
            dyAdd(heap, &tasks[i]);
        }
        for (int i = 0; i < n; i++)
        {
            dyPut(heap, &tasks[rand() % n], 0);
            adjustHeap(heap, dySize(heap) - 1, 0, taskCompare);
            assertHeapProperty(test, heap);
        }
        dyDelete(heap);
    }
    free(tasks);
}
void testAdjustHeap(CuTest*test)
{
常数int n=100;
Task*tasks=createTasks(n);
对于(int j=0;j
“indexSmallest”功能:

TYPE dyGet(DynamicArray* array, int position)
{
    assert(position < array->size);
    return array->data[position];
}
int indexSmallest(struct DynamicArray * v, int i, int j) { /* return index of smallest element */
    if(i < j) {
        return i;
    }
    return j;
}
int indexSmallest(struct DynamicArray*v,int i,int j){/*最小元素的返回索引*/
if(i
将数组传递到索引中的目的是什么?函数看起来是错误的。无论基于什么,我总是会小于j

int leftChild = 2 * pos + 1;
int rightChild = 2 * pos + 2;
如果你谈论的是这些孩子的实际数据,那么看起来可能会有所不同。 也许是路过

indexSmallest(v->data[leftChild], v->data[rightChild])

我希望这会有所帮助

你所说的“失败”到底是什么意思?断言没有通过……即:
position
大于
array->size
。如果我没有断言,这将导致索引超出范围错误,但无论哪种方式都不起作用。您需要使用调试器(或向代码中添加一些printf),以便在断言失败时查看变量的值。顺便说一句,我觉得问题出在
indexSmallest
,但您还没有显示该代码。看。你的索引最小是什么样子的?试着在….中打印出位置和大小。。。。。键入dyGet(DynamicArray*array,int-position){assert(positionsize);return-array->data[position];}您得到了什么数字?