2017-03-03 5 views
0

エラーはポインタに関連しているようですが、何が起こっているのかを正確に特定できません。私は後でカードの配列を型とスーツに分割しますが、今は何が起こっているのかを理解したいと思います。私はスワップポインタのパラメータを実際に成功させようとしました。私は大いに助けていただければ幸いです。デッキとカードオブジェクトでのC++アクセス違反の読み取り場所0xCCCCCCCC

//in functions.cpp 
#include "Header.h" 

void randomizer() 
{ 
    srand(time(NULL)); 
} 

void swap(string a, string b) 
{ 
    string temp = a; 
    a = b; 
    b = temp; 
} 

string Card::generateRandomCard() 
{ 
    randomizer(); 
    int random = rand() % 52; 
    cout << "Your draw is: " << card[random] << endl; 
    return card[random]; 
} 

void Deck::randomize(string arr[], int size) 
{ 
    randomizer(); 
    for (int i = size - 1; i > 0; i--) 
    { 
     int j = rand() % (i + 1); 

     swap(arr[i], arr[j]); 
    } 
} 

void Deck::printDeck() 
{ 
    randomizer(); 
    Card card1; 
    cards[52] = card1.card[52]; 
    randomize(cards, 52); 
    for (int i = 0; i < 52; i++) 
    { 
     cout << cards[i] << endl; 
    } 
    cout << "\nYour hand: " << cards[51] << endl << cards[50] << endl << cards[49] << endl << cards[48] << endl << cards[47] << endl; 
    cout << "The next card in the deck is: " << cards[48] << endl; 
} 

//in Header.h 
#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <ctime> 
#include <iomanip> 

using namespace std; 

void randomizer(); 
void swap(string a, string b); 

class Card 
{ 
public: 
    string generateRandomCard(); 
    const string card[52] = { "2 of Clubs", "3 of Clubs", "4 of Clubs", "5 of Clubs", "6 of Clubs", "7 of Clubs", "8 of Clubs", "9 of Clubs", "10 of Clubs", "J of Clubs", "Q of Clubs", "K of Clubs", "A of Clubs", 
     "2 of Spades", "3 of Spades", "4 of Spades", "5 of Spades", "6 of Spades", "7 of Spades", "8 of Spades", "9 of Spades", "10 of Spades", "J of Spades", "Q of Spades", "K of Spades", "A of Spades", 
     "2 of Hearts", "3 of Hearts", "4 of Hearts", "5 of Hearts", "6 of Hearts", "7 of Hearts", "8 of Hearts", "9 of Hearts", "10 of Hearts", "J of Hearts", "Q of Hearts", "K of Hearts", "A of Hearts", 
     "2 of Diamonds", "3 of Diamonds", "4 of Diamonds", "5 of Diamonds", "6 of Diamonds", "7 of Diamonds", "8 of Diamonds", "9 of Diamonds", "10 of Diamonds", "J of Diamonds", "Q of Diamonds", "K of Diamonds", "A of Diamonds" }; 
private: 
}; 

class Deck 
{ 
public: 
    void randomize(string arr[], int size); 
    void printDeck(); 
private: 
    string cards[52]; 
}; 

//in main.cpp 
#include "Header.h" 

void main() 
{ 
    Card card1; 
    Deck mainDeck; 
    mainDeck.printDeck(); 
    card1.generateRandomCard(); 
} 
+1

[OT]: 'srand(time(NULL));'を一度だけ呼び出します。 – Jarod42

+0

'void swap(文字列a、文字列b)'はほとんど役に立ちません。参照が欠落しています。 – Jarod42

+2

'cards [52] = card1.card [52];'は期待したことをしません。 C配列の代わりに 'std :: array'または' std :: vector'を使用した場合、配列の内容をコピーするには 'cards = card1.card'となります。 – Jarod42

答えて

1

は、Microsoft Visual Studioによって初期化されていないポインタに保存される特別な値です。あなたが投稿したコードは、あなたが行うとき、アウトオブバウンドアクセスが含まれています

cards[52] = card1.card[52];

配列のサイズは52ですが、配列は、オフセットによってインデックス付けされているので、オフセット52は53thに上陸う要素は存在しません。

行ごとにコードをデバッグして、エラーがスローされたときを検出できます。

+1

[いつ、そしていつOSがmalloc/free/new/deleteの0xCD、0xDDなどにメモリを初期化するのですか?](http://stackoverflow.com/q/370195/995714) –

+0

@LưuVĩnhPhúcNice! – Kahler

+0

@ Kahler Mainで呼び出された最初のオブジェクトであるCardオブジェクトに入ってくるときに、文字列を読み込む際にエラーが発生したとします。 – Deneb

関連する問題