【问题标题】:C++ qsort inside function on array of structs结构数组上的C ++ qsort内部函数
【发布时间】:2013-11-15 04:42:20
【问题描述】:

又是我,我正在处理 zipType 的数组的 qsort。我写的比较函数是这样的:

    int compare(const void *v1, const void *v2){
        const struct zipType *p1 = v1;
        const struct zipType *p2 = v2;
        if (p1->postalCode > p2->postalCode)
            return(+1);
        else if (p1->postalCode < p2->postalCode)
            return(-1);
        else
            return(0);
        }

这是使用它的函数:

   void binRead(zipType *zip, fstream *input){
   int junk;
   int count;
   int end;
   input->seekg(0,ios::end);
   end=input->tellg();
   count=input->tellg()/24;
   input->seekg(0);

   while(input->tellg()!=end){  
    for(int i=0;i<count;i++){
        input->read((char*)( &(zip[i].postalCode) ), sizeof(int    ));
        input->read((char*)( &junk ),                sizeof(int    ));
        input->read((char*)( &(zip[i].longitude)  ), sizeof(double  ));
        input->read((char*)( &(zip[i].latitude)   ), sizeof(double  ));
        cout << "Currently at position" << input->tellg() << endl;
     }
   }

   cout << "Array Created, Please wait while I sort" << endl;
   qsort(zip, count, sizeof(int), compare);
   usleep(3000000);
   cout << "Array Sorted" << endl;

  }

我遇到的错误是以下几个:

    invalid conversion from ‘const void*’ to ‘const zipType*’ [-fpermissive]
    const struct zipType *p2 = v2;

其中之一:

     error: cannot convert ‘zipType’ to ‘void*’ for argument ‘1’ to ‘void qsort(void*, size_t, size_t, int (*)(const void*, const void*))’
     qsort(*zip, count, sizeof(int), compare);

任何想法我应该做什么?

【问题讨论】:

  • C 还是 C++?只能有一个。
  • 你需要像这样调用qsort()qsort((void *)zip, count, sizeof(*zip), compare); 因为 zip 是一个包含多个元素的类,所以 qsort() 的第三个参数是 qsort() 正在排序的每个元素的大小。同样,qsort() 的第一个值需要是指向元素数组的基指针,每个元素的大小作为第三个参数传递。
  • const struct zipType *p2 = (const struct zipType*)v2;
  • @user2990286:为什么你不想使用 std::sort?
  • 使用 qsort 代替 sort 只是任务的一部分。除此之外没有真正的原因。我可以在 main 中更容易地做到这一点,但我认为如果函数继续进行排序会更好看。 :S

标签: c++ arrays function qsort


【解决方案1】:

要修复第一个错误,您需要在比较例程中从void* 转换:

auto p1 = static_cast<const struct zipType*>(v1);

要修复第二个错误,我认为我们需要再次转换,但这次是void*

qsort(static_cast<void*>(zip), count, sizeof(zipType*), compare)

老实说,我不确定为什么需要这个演员表。如果我没记错我的转换规则,zipType* 应该可以隐式转换为void*。如果有人知道,请发表评论,我将编辑答案,或者,如果可以,请编辑答案。

请注意,您需要数组中元素的大小为third parameter,而不是sizeof(int)。你有一个zipType* 不是int 的数组。

由于您使用的是 C++(推断是因为您使用的是 std::cout),但请尝试使用 std::sort。它的类型更安全,通常可以更好地优化。

std::sort(zip, std::advance(zip, count), compare)

另外,因为这是 C++,所以你不需要说struct zipType。你可以直接说zipType

【讨论】:

  • 感谢您的帮助,我会使用排序,但对于这项任务,他们需要 qsort。在 main 中很容易做到,但是当我开始使用 *variable 和 &variable 时我真的很困惑。
【解决方案2】:

你应该先阅读qsort。然后你就会知道每个参数的含义。

你的 qsort 应该是这样的: qsort((void*)zip, count, sizeof(struct zipType), compare);

第三个参数size表示数组中elem的大小,应该是zipType而不是int

【讨论】:

  • 整个项目是 zipType 但我是根据 postalCode 排序的,它的大小是 int。所以我想我需要把 int 放在那里。在过去的一个小时里,我已经阅读了 qsort。它很简单,直到我把它放在一个函数中并用它对结构进行排序并且必须开始引用内存而不是变量。
  • qsort 不在乎您是否按邮政编码进行比较。它需要知道项目的大小,以便正确计算第一项、第二项等的地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2013-10-27
相关资源
最近更新 更多