2011-06-25 2 views
2

Lorsque j'utilise des cartes additionnelles avec add_card, la septième carte est supposée trier toutes les cartes. Mais quand je cours cela, j'obtiens un résultat semi-ordonné.Pourquoi mes résultats qsort sont-ils incorrects?

>> 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 

Je ne pense pas qu'il y ait un problème avec NUM2INT, parce que quand j'imprimer le tableau arrière non ordonnée, il sort comme prévu.

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

Répondre

4

Vous castez les valeurs de cartes à double dans compare_card_values même si le tableau contient int. Essayez ceci à la place:

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