Нишка 1: EXC_BAD_ACCESS (код =1 адрес = 0x0)

Опитвам се да създам прост симулатор за разбъркване и раздаване на карти. Използвам вектор, за да представя тесте от 52 карти и всяка карта е представена от структурата BitCard, чието пространство на елементите е памет, ограничено от битови полета. Но когато конструкторът се опита да получи достъп до вектора, xCode хвърля BAD_ACCESS exception: Thread 1: EXC_BAD_ACCESS (code =1 address = 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;

Как мога да поправя това? Благодаря предварително!


person Endi Zhupani    schedule 20.02.2015    source източник


Отговори (2)


Опитвате се да получите достъп до елемент от вашия вектор 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);
    }
}
person Jérôme    schedule 20.02.2015

Размерът на вашия 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 )
    }
}
person Drew Dormann    schedule 20.02.2015
comment
Преоразмеряването му в конструктора свърши работа. Благодаря много! - person Endi Zhupani; 21.02.2015