【发布时间】: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。