2011-10-06 92 views
1

我有我的qsort比较函数的问题。我有一个类型为ListEntry的数组,mGames。一个ListEntry看起来是这样的:qsort在c没有排序我的结构数组

struct ListEntry 
{ 
    bool mLocal; 
    int mLastTurnTime; 
}; 

这实际上相当过于简单,在那里有更多的数据,但它不是在排序中使用,所以我省略了。无论如何,我正在努力使得将mLocal设置为true的条目先排序。问题是,我无法顺序排列我的数组。这里的比较函数:

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 

当我踏进比较法,E1和E2包含其数据如预期(如,我不访问垃圾内存或向右没提领的东西)。

奇怪的是,无论我如何改变比较方法,我都无法得到改变的顺序。我必须忽略一些非常明显的东西。

+0

比较器中的按值分配是否意外?您不应该取消引用指针,而是将转换的结果分配给另一个指针。我想我们需要更多的代码。 – pmr

+0

啊,很好的电话。我已经在我的代码中更改了它,只是使用指针值而不是解除引用。 – Architekt

+1

顺便问一下,这是C(标签,使用qsort)还是C++(变量声明中没有struct关键字,bool,void指针的转换)?在前一种情况下,它必须是一些奇怪的扩展(我知道C99有bool,但是直接使用struct没有struct关键字?),在后一种情况下,不要使用'qsort',反正使用'std :: sort'。 –

回答

4

你的功能不是偏序。这

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 --; 
} 
+0

嗯,所以事实证明,主要问题是我没有更新我的列表元素后,我将它们排列在后面:我忘了我在qsort之前将它们出现在屏幕上的位置。事实证明这是问题的真正要旨,尽管感谢大家的建议,但这些也是一个更大问题的一部分。 – Architekt