我有一个通用的快速排序函数:

void qsort(void* sup,int n,
 int(*cmp) (void *x,void *y),
  void (*swap) (void *a,void *b))
{
 int pv=n/2,l=0,h=n-1;

 if(n<2)
  return;

 while(h-1>=l)
 {
  if(l==pv)
  {
   swap(sup+pv,sup+pv+1);
   pv++;
  }
  if(h==pv)
  {
   swap(sup+pv,sup+(pv-1));
   pv--;
  }
  if(cmp(sup+h, sup+pv))
  {
   h--;
   continue;
  }
  if(cmp(sup+pv, sup+l))
  {
   l++;
   continue;
  }
  swap(sup+l,sup+h);
  l++,h--;
 }
 qsort(sup, l, cmp, swap);
 qsort(sup+l,n-l, cmp, swap);
}

以这些函数作为参数:
int cmp(int *c1, int *c2) {
 return *c1 > *c2;
}

void swap(int *a,int *b)
{
 int c= *a;
 *a=*b;
 *b=c;
}

主要功能如下:
int main()
{
 int arr[4] = {3,4,1,2};
 print(arr, 4);
 printf("\n\n");
 qsort(arr, 4, &cmp, &swap);
 print(arr, 4);
 return 0;
}

打印位置:
void print(int* arr, int size) {
 int i = 0;
 for(; i < size; ++i) {
  printf("%d \t", arr[i]);
 }
}

问题是:
qsort的原型是:
void qsort(int* sup,int n,
 int(*cmp) (void *x,void *y),
  void (*swap) (void *a,void *b))

效果很好,
但当我将sup参数更改为void*时:
void qsort(void* sup,int n,
 int(*cmp) (void *x,void *y),
  void (*swap) (void *a,void *b))

它不起作用。有人知道为什么吗?
我在用Windows下的Code::Blocks和MinGW。

最佳答案

您必须能够取消对参数的引用。void*无法取消引用,因为编译器无法确定要传递的类型。如果通过void*,则必须使用显式强制转换。
这个

void qsort(int* sup,int n,
 int(*cmp) (void *x,void *y),
  void (*swap) (void *a,void *b))

很好,但在这里
void qsort(void* sup,int n,
 int(*cmp) (void *x,void *y),
  void (*swap) (void *a,void *b))

您正在传递一个void*(sup),而这个不能取消引用。所以您的第一个解决方案很好,但是您必须在(*cmp)中进行类型转换,或者为每种类型定义一个qsort。

08-26 13:24