2011-06-25 11 views
2

add_cardを使ってカードを追加すると、7枚目のカードにすべてのカードを並べ替えることになっています。しかし、これを実行すると半順序の結果が得られます。qsortの結果が正しくないのはなぜですか?

>> 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); 
} 

答えて

4

あなたは配列が含まれていてもcompare_card_valuesdoubleにカード値をキャストしています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); 
} 
関連する問題