【问题标题】:qsort in c not sorting my array of structsc中的qsort没有对我的结构数组进行排序
【发布时间】:2011-12-02 15:55:12
【问题描述】:

我的 qsort 比较函数有问题。我有一个 ListEntry 类型的数组 mGames。 ListEntry 看起来像这样:

struct ListEntry
{
    bool mLocal;
    int  mLastTurnTime;
};

这实际上过于简单化了,那里有更多数据,但它没有用于排序,所以我省略了它。无论如何,我正在努力使 mLocal 设置为 true 的条目首先排序。问题是,我无法让 qsort 订购我的数组。这是比较函数:

int compare(const void* a, const void* b)
{
    ListEntry* e1 = (ListEntry*)a;
    ListEntry* e2 = (ListEntry*)b;
    if (e1->mLocal && e2->mLocal)
        return 0;
    return e1->mLocal ? -1 : 1;
}

我对它的呼吁:

qsort(mGames, mNumGames, sizeof(ListEntry), compare);

其中 mNumGames 是数组中的游戏数(在我当前的测试用例中是 7 个),mGames 定义为:

ListEntry mGames[MAX_GAMES]; // where MAX_GAMES is 50

当我进入 compare 方法时,e1 和 e2 会按预期包含它们的数据(例如,我没有访问垃圾内存或没有正确取消引用)。

奇怪的是,无论我如何更改比较方法,我都无法更改顺序。我一定忽略了一些非常明显的东西。

【问题讨论】:

  • 比较器中的按值分配是偶然的吗?您不应该取消引用指针,而是将强制转换的结果分配给另一个指针。我想我们需要更多代码。
  • 啊,好电话。我在我的代码中将其更改为仅使用指针值而不是取消引用。
  • 顺便问一下,这是 C(标记,使用 qsort)还是 C++(变量声明中没有 struct 关键字,bool,void 指针强制转换)?前一种情况肯定是一些奇怪的扩展(我知道 C99 有 bool,但是直接使用 struct 没有 struct 关键字?)而在后一种情况下,无论如何不要使用qsort,使用std::sort

标签: c qsort


【解决方案1】:

您的函数不是偏序。这个

if (e1.mLocal && e2.mLocal)
    return 0;

实际上应该是

if (e1.mLocal == e2.mLocal)

关键是,一旦你处理了qsort(以及其他排序例程,你需要确保比较关系是传递的和反对称的。这在你的情况下是不正确的。

顺便说一句,由于您仅在两个类中有效地排序,因此将带有.mLocal == 1 的元素移动到数组的开头可能会更快

ListEntry *first = beginning of the array, *last = end of the array;
while(first < last) {
  if(!first->mLocal && last->mLocal)
    swap(first, last); // swap the two elements
  if(first->mLocal) first++;
  if(!last->mLocal) last --;
}

【讨论】:

  • 啊,所以事实证明主要问题是我没有更新列表元素在 qsort 之后绘制的位置:我忘记了我正在分配它们在屏幕上的显示位置在 qsort 之前。原来这是问题的真正要点,虽然在这里感谢大家的建议,这些也是更大问题的一部分。
猜你喜欢
  • 2014-05-21
  • 1970-01-01
  • 2021-07-16
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多