В моем коде 2 структуры;card(value, suit)
и deck(**cards, n)
, и я пытаюсь перетасовать карты внутри колоды.
Внутри цикла for функции shuffle()
.
i-я карта после первой картысохраняется в temp_card
.
Случайная карта выбирается и присваивается i-й карте.
temp_card
назначено случайной карте.
Проблема в том, что программа останавливает выполнение на этой строке, возможно, из-за ошибки сегментации.
**(d->cards + i) = **(d->cards + random_number);
Я попытался отладитьс GDB, но это не было очень конкретным.Это код.Я также добавил несколько карт и колоды в main()
, чтобы протестировать его, но я довольно плохо знаком с C, так что я мог бы также испортить места в памяти этих указателей.
Правильный ли мой подход к тасованиюили я должен изменить его, и почему программа останавливается на этой строке, потому что указанные мной указатели недействительны?
#include <stdio.h>
#include <stdlib.h>
#define VALUE_ACE 14
#define VALUE_KING 13
#define VALUE_QUEEN 12
#define VALUE_JACK 11
typedef enum {
SPADES,
HEARTS,
DIAMONDS,
CLUBS,
NUM_SUITS
} suit_t;
struct card_tag {
unsigned value;
suit_t suit;
};
typedef struct card_tag card_t;
struct deck_tag {
card_t ** cards;
size_t n_cards;
};
typedef struct deck_tag deck_t;
void shuffle(deck_t * d){
card_t temp_card;
int n = d->n_cards;
int random_number;
for (int i = 0; i < n; i++){
temp_card = **(d->cards + i);
random_number = rand() % n;
**(d->cards + i) = **(d->cards + random_number);
**(d->cards + random_number) = temp_card;
}
}
int main(){
deck_t deck;
card_t card1;
card1.suit = 1;
card1.value = 1;
card_t *c_ptr = &card1;
card_t **c_pptr = &c_ptr;
card_t card2;
card2.suit = 2;
card2.value = 2;
card_t *c_ptr2 = &card2;
card_t **c_pptr2 = &c_ptr2;
card_t card3;
card3.suit = 0;
card3.value = 5;
card_t *c_ptr3 = &card3;
card_t **c_pptr3 = &c_ptr3;
card_t card4;
card4.suit = 2;
card4.value = 2;
card_t *c_ptr4 = &card4;
card_t **c_pptr4 = &c_ptr4;
deck.cards = c_pptr;
deck.n_cards = 4;
deck_t *d_ptr = &deck;
shuffle(d_ptr);
}