【问题标题】:Sorting 2D arrays with qsort - correct typecasting使用 qsort 对二维数组进行排序 - 正确的类型转换
【发布时间】:2016-01-05 19:05:02
【问题描述】:

我在使用 c++ qsort 比较函数正确按字典顺序对 2d 整数数组进行排序时遇到问题。我已经在这里阅读了许多类似的问题,但没有成功。在制作自定义比较函数时,其参数的形式为

int compar (const void* p1, const void* p2)

现在,我知道它的参数是指向我的变量的指针,每个指针指向我的数组的一行。我想使用类似以下的方法以常规方式索引和比较我的数组。

if(p1[0] <= p2[0]) {...}

因为我知道,格式

p1[i]

只是指针算术的一种快捷方式,我想当我收到一个参数“指向 int 的指针”时,我应该进行类型转换并以这种方式使用它:

if(*(int**)p1[0] <= *(int**)p2[0]) {...}

但是编译器给了我很多这样的错误

main.cpp:8:20: error: ‘const void*’ is not a pointer-to-object type
main.cpp:8:37: warning: pointer of type ‘void *’ used in arithmetic  [-Wpointer-arith]

我的问题是,如何正确地进行类型转换,这样我就可以比较我的行了。另外,我想了解一下,我在这里做错了什么以避免将来犯这些与指针相关的错误。

【问题讨论】:

  • 在 C++ 中,您可能需要考虑使用 std::sort 而不是 qsort
  • 但是仍然需要使用这种自定义比较函数,因为我需要以更多方式对数组进行排序 - 按照字典顺序按照 cols 231、321、123 等,这不是让它更容易,我仍然需要进行类型转换吗?
  • 不,你没有。 C++ 有 模板 可以在编译时优雅地处理类型。 std::sort 是一个光辉的榜样
  • 你是否真的有一个二维数组,在这种情况下,即使你“更正”它,转换也是非常错误的,还是一个一维指针数组?

标签: c++ c arrays pointers qsort


【解决方案1】:

这是因为operator[] 优先于演员表。 b[0] 正在尝试首先解决。因此,即使它是 b[0],它也会抱怨您正在对 void* 类型进行指针运算。你需要投第一个。

#include <iostream>
using namespace std;

int main() {
    int a[10];
    a[0] = 1337;
    a[1] = 42;
    void* b;
    b = (void*)a;

    //  cout << (int*)b[0] << '\n'; // will break
    cout << ((int*)b)[0] << '\n';

    // dedicated c++ cast imposes more verbose syntax - i.e. you can't miss the ()
    cout << static_cast<int*>(b)[1] << '\n';
    return 0;
}

话虽如此,我仍然会鼓励使用 c++ 专用功能来完成您的工作 =)。

【讨论】:

  • 看来,这是罪魁祸首,我加了括号,编译器没有报错,谢谢!
  • 它解释了你的错误,但我仍然认为采用 c 风格不是方式 =)。无论如何都欢迎你=)
最近更新 更多