为什么我的qsort结果不正确?

时间:2011-06-25 17:35:07

标签: c ruby

当我使用add_card运行添加卡时,在第7张卡上应该对所有卡进行排序。但是当我运行这个时,我得到一个半有序的结果。

>> require 'ext/straight_count' #=> true                                                                                          >> s = EV::StraightCount.new; s.add_card(5,0); s.add_card(8,1); s.add_card(12,2); s.add_card(14,3); s.add_card(12,4); s.add_card(3,5); s.add_card(5,6)
card: 12
card: 5
card: 12
card: 14
card: 8
card: 5
card: 3

我认为NUM2INT没有问题,因为当我按顺序打印数组时,它会按预期出现。

straight.h

int *pCards, *pSortedCards;
int cCards[NUM_CARDS], cSortedCards[NUM_CARDS];

straight.c

void Init_straight() 
{
    pCards = &cCards[0];
}

static VALUE 
add_card(VALUE self, int rCardValue, int rCardIndex)  
{
    *(pCards + NUM2INT(rCardIndex)) = NUM2INT(rCardValue);
    if (NUM2INT(rCardIndex) == 6)
        check_for_straight();

    return Qnil;
}

check_for_straight()
{
    sort_by_value(pCards);
}

card_sort.c

int compare_card_values (const void *a, const void *b) 
{
    const double *da = (const double *) a;
    const double *db = (const double *) b;
    return (*da > *db) - (*da < *db);
}

void sort_by_value(int *pCards) 
{
    qsort(pCards, NUM_CARDS, sizeof(pCards[0]), compare_card_values);
}

1 个答案:

答案 0 :(得分:4)

即使数组中包含double,您也会将卡片值转换为compare_card_values中的int。试试这个:

int compare_card_values (const void *a, const void *b) 
{
    const int *da = (const int *) a;
    const int *db = (const int *) b;
    return (*da > *db) - (*da < *db);
}