C 穿过空隙**

C 穿过空隙**,c,sorting,pointers,void,C,Sorting,Pointers,Void,我想通过计算方法的大小来更新我的插入,而不是将其作为参数传递。我怎样才能循环到一个空**?或者是否有特定的方法来计算数组的维数 void insertion_sort(int size, void** array, CompFunction compare){ int i,j; void* key; for(i = 1; i<size;i++){ key = array[i]; for(j = i-1; j>=0 &&a

我想通过计算方法的大小来更新我的插入,而不是将其作为参数传递。我怎样才能循环到一个空**?或者是否有特定的方法来计算数组的维数

void insertion_sort(int size, void** array, CompFunction compare){
    int i,j;
    void* key;
    for(i = 1; i<size;i++){
        key = array[i];
        for(j = i-1; j>=0 && compare(array[j],key)>=0;j--){
            swap(&array[j+1],&array[j]);
        }
        array[j+1] = key;
    }
}
void插入\u排序(整数大小、void**数组、CompFunction比较){
int i,j;
无效*键;
对于(i=1;i=0&&compare(数组[j],键)>=0;j--){
交换(&数组[j+1],&数组[j]);
}
数组[j+1]=键;
}
}
我想通过计算方法的大小来更新我的插入,而不是将其作为参数传递。如何循环到
void**
?或者是否有特定的方法来计算数组的维数

void insertion_sort(int size, void** array, CompFunction compare){
    int i,j;
    void* key;
    for(i = 1; i<size;i++){
        key = array[i];
        for(j = i-1; j>=0 && compare(array[j],key)>=0;j--){
            swap(&array[j+1],&array[j]);
        }
        array[j+1] = key;
    }
}
您的函数未接收数组。它正在接收一个指针(指向
void*
)。假设接收到的指针有效,它指向的对象可以被视为数组的第一个元素(即使调用者将其声明为标量),但指针不传递该数组的长度。你必须单独沟通。这方面最常见的技术有:

  • 如您所示,将长度作为单独的参数传递,或
  • 如标准库的字符串函数所期望的那样,在数组中包含一个数据结束前哨值作为最后一个值

  • 除非长度以某种方式编码到指向数组元素本身(例如,通过sentinel),否则被调用函数无法仅从指针确定数组大小。想一想,因为它完全独立于逻辑。

    为什么参数是一个问题?通常指针数组以
    NULL
    终止,或者给定大小。解决这个问题将是一个新问题。您正在尝试类似于
    sort()
    的方法,为什么不看看它是如何处理这个问题的呢。@尼尔,或者更确切地说,
    qsort()