2015-02-20 3 views
1

Я пытаюсь создать простую карточную тасовку и симулятор. Я использую вектор, представляющий колоду из 52 карт, и каждая карта представлена ​​структурой BitCard, чьи пространства элементов ограничены битовыми полями. Но когда конструктор пытается получить доступ к вектору, xCode выдает BAD_ACCESS exception: Thread 1: EXC_BAD_ACCESS (code =1 address = 0x0). Я провел некоторое исследование и обнаружил, что это исключение связано с нулевым указателем, но не может понять, как его исправить. Мой код выглядит следующим образом:Тема 1: EXC_BAD_ACCESS (код = 1 адрес = 0x0)

#include <iostream> 
#include <cctype> 
#include <cstdlib> 
#include <vector> 
#include <iomanip> 
using namespace std; 
struct BitCard{ 
    unsigned face:4; 
    unsigned color:1; 
    unsigned suit:2; 
}; 
class DeckOfCards { 
public: 
    static const int faces = 13; 
    static const int colors = 2; 
    static const int numberOfCards = 52; 
    DeckOfCards(); 
    void shuffle(); 
    void deal(); 
private: 
    vector <BitCard> deck={}; 
}; 
DeckOfCards::DeckOfCards(){ 
    for (int i = 0; i <numberOfCards;++i){ 
     deck[i].face = i%faces; 
     deck[i].suit = i/faces; 
     deck[i].color = i/(faces*colors); 
    } 
} 
void DeckOfCards:: shuffle(){ 
    for (int i = 0; i <numberOfCards;i++){ 
     int j = rand()%numberOfCards; 
     BitCard tmp = deck[i]; 
     deck[i] = deck[j]; 
     deck[j] = tmp; 
    } 
} 
void DeckOfCards:: deal(){ 
    for (int k1 = 0, k2 = k1+numberOfCards/2;k1<numberOfCards/2-1;k1++,k2++) 
    { 
     cout << "Color:" << setw(3) << deck[k1].color 
     << " Card:" << setw(3) << deck[k1].face 
     << " Suit:" << setw(3) << deck[k1].suit 
     << " Color:" << setw(3) << deck[k2].color 
     << " Card:" << setw(3) << deck[k2].face 
     << " Card:" << setw(3) << deck[k2].suit; 
    } 
} 



int main(int argc, const char * argv[]) { 
    DeckOfCards testDeck; 
    testDeck.shuffle(); 
    testDeck.deal(); 

    return 0; 
} 

Исключение генерируется в соответствии

deck[i].face = i%faces; 

Как я могу это исправить? Спасибо заранее!

+0

Несвязанный: 'неподписанный цвет: 1;' дал мне одиннадцать воспоминаний Океана. «Прочитайте их и плачьте люди: * Все красные !! *» – WhozCraig

ответ

1

Вы пытаетесь получить доступ к элементу вашего вектора deck в конструкторе. Но при вызове конструктора ваш deck вектор пуст

vector <BitCard> deck={}; // <- empty deck 

DeckOfCards::DeckOfCards(){ 
    for (int i = 0; i <numberOfCards;++i){ 
     deck[i].face = i%faces; // <- At construction time, you are trying to access deck with index i. but Deck is empty! 
     //... 
    } 
} 

Одно из решений состоит в построении вашего объекта BitCard и подтолкнуть ее к vector

DeckOfCards::DeckOfCards(){ 
    for (int i = 0; i <numberOfCards;++i){ 
     BitCard myBitCard; 
     myBitCard.face = i%faces; 
     myBitCard.suit = i/faces; 
     myBitCard.color = i/(faces*colors); 
     deck.push_back(myBitCard); 
    } 
} 
1

Размер вашего deck вектора всегда равна 0. Используя [], чтобы индексировать вектор не будет автоматически изменяет размер вектора чтобы вместить недопустимый индекс.

Вы можете инициализировать его до нужного размера.

vector <BitCard> deck(numberOfCards); 

Или измените его размер в конструкторе.

DeckOfCards::DeckOfCards(){ 
    deck.resize(numberOfCards); 

Или вы можете использовать push_back в цикле конструктора, чтобы добавить каждую новую карту до конца вектора.

DeckOfCards::DeckOfCards(){ 
    for (int i = 0; i <numberOfCards;++i){ 
     BitCard card; 
     card.face = i%faces; 
     card.suit = i/faces; 
     card.color = i/(faces*colors); 
     deck.push_back(card) 
    } 
} 
+0

Смещение его в конструкторе сработало. Большое спасибо! –

Смежные вопросы