2

それで、私はC ++に慣れるために、簡単なポーカーゲームを作成しようとしています。私はしばらくの間それをやめていて、C++に戻りたいと思っています。

STLからのスタックに問題があります(適切ですか?)。スタックに何かを追加できるようにすることができないようです。スタックオブジェクトでpush関数を呼び出すたびに、メモリアクセス違反がスローされます...整数のスタックを作成してスタックに追加しようとしましたが、それでもメモリアクセス違反エラーがスローされます。これは奇妙です。

現在オブジェクトをスタックに追加しているコードは次のとおりです。

//shuffles the deck
void Deck::shuffle()
{
    int index;

    for(int i = 0; i < DECK_SIZE; i++)
    {
        index = (rand() % 52);

        if(deck[index].drawn == false)
        {
            shuffledDeck.push(deck[index]); //throws the error
            deck[index].drawn = true;
        }
        else
        {
            i--;
        }
    }
}

ブレークポイントを設定し、それをウサギの穴に沿って追跡したところ、ここで例外がスローされることがわかりました。

void push_back(const value_type& _Val)
{   // insert element at end
    this->_Orphan_all();
    _PUSH_BACK_BEGIN;            //EXCEPTION!
    this->_Getal().construct(
    this->_Map[_Block] + _Newoff % _DEQUESIZ, _Val);
    _PUSH_BACK_END;
}

これはdeque.cppにあります...これは奇妙です。

参考までに、必要と思われる残りのコードは次のとおりです。

Deck.cpp

#include "stdafx.h"
#include "Deck.h"
#include <time.h>

using namespace std;
using namespace CardDeck;

const int DECK_SIZE = 52;



CARD deck[DECK_SIZE];
std::stack<CARD> shuffledDeck;



Deck::Deck()
{
    srand((unsigned int)time(NULL));
    loadCards();
}

Deck::~Deck()
{
}

//Draws a card from the deck
CARD Deck::drawCard()
{
    CARD card = shuffledDeck.front();
    shuffledDeck.pop();
    return card;
}

//shuffles the deck
void Deck::shuffle()
{
    int index;

    for(int i = 0; i < DECK_SIZE; i++)
    {
        index = (rand() % 52);

        if(deck[index].drawn == false)
        {
            shuffledDeck.push(deck[index]);
            deck[index].drawn = true;
        }
        else
        {
            i--;
        }
    }
}

    void Deck::loadCards()
    {

        //create input file stream
        ifstream cardList;

        //open the list of cards
        cardList.open("card.txt", ios::in);

        //if the file has opened successfully
        if(cardList.is_open())
        {
            int index = 0;

            //and while the cardlist has data left
            while(cardList.good())
            {
                char * context = NULL;
                CARD card = CARD();
                //read the cards
                string line;
                getline(cardList, line);

                char * s = strtok_s(&line[0], ", ", &context);

                card.value = *s;

                s = strtok_s(NULL, ", ", &context);

                card.suit = s;
                card.drawn = false;

                deck[index] = card;

                index++;
            }
        }

    }

Deck.h(CARD構造体を含む)

#pragma once
#include <string>
#include <stack>
#include <fstream>
#include <sstream>
#include <iostream>
#include <string>

namespace CardDeck
{
    struct CARD
    {
        public:
            std::string suit;
            char value;
            bool drawn;

            CARD(){}

            CARD(const CARD& card)
            {
                suit = card.suit;
                value = card.value;
                drawn = card.drawn;
            }

            CARD& operator= (const CARD& card)
            {
                suit = card.suit;
                value = card.value;
                drawn = card.drawn;

                return *this;
            }
    };

        class Deck
        {
            public:
                Deck();
                ~Deck();
                Deck(const Deck& deck);
                CARD drawCard();
                void shuffle();

            private:
                void loadCards();

        };
    }
4

1 に答える 1

4

deckおそらく、配列の末尾を超えて書き込みを行っており、loadCards()メモリが破損しています。

正確に 52 行のデータがある場合でも、指示のまでcardlist.good()戻ります。trueEOF

代わりに次のループを試してみてください (未テスト):

string line;
while(getline(cardList, line) && (index < 52))
{
    char * context = NULL;
    CARD card = CARD();

    char * s = strtok_s(&line[0], ", ", &context);

    card.value = *s;

    s = strtok_s(NULL, ", ", &context);

    card.suit = s;
    card.drawn = false;

    deck[index] = card;

    index++;
}
于 2012-11-20T02:06:45.000 に答える