堆栈抛出内存访问冲突 P>我想创建一个简单的扑克游戏来重新熟悉C++,因为我已经有一段时间没有玩了,想回到C++。p>

堆栈抛出内存访问冲突 P>我想创建一个简单的扑克游戏来重新熟悉C++,因为我已经有一段时间没有玩了,想回到C++。p>,c++,stack,access-violation,deque,C++,Stack,Access Violation,Deque,我对STL中的适当堆栈(否)有问题。我似乎无法让它允许我在堆栈中添加任何内容。每次我调用堆栈对象上的push函数时,它都会抛出内存访问冲突。。。我甚至尝试创建一个整数堆栈,并将它们添加到堆栈中,但它仍然抛出内存访问冲突错误。这很奇怪 当前将对象添加到堆栈的代码为: //shuffles the deck void Deck::shuffle() { int index; for(int i = 0; i < DECK_SIZE; i++) { in

我对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--;
        }
    }
}
位于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++;
            }
        }

    }
h包含卡片结构

#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();

        };
    }

您可能正在写超过loadCards中数据组数组的末尾,从而损坏内存

即使您正好有52行数据,cardlist.good也会在EOF指示后返回true

您可能希望尝试以下未经测试的循环:

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++;
}

您可能正在写超过loadCards中数据组数组的末尾,从而损坏内存

即使您正好有52行数据,cardlist.good也会在EOF指示后返回true

您可能希望尝试以下未经测试的循环:

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++;
}

这里没有手动洗牌,而是有一个标准的功能:。哦,天哪,我试着把它改成一个队列,但忘了把它改回去了。哈哈。但是队列也会发生错误。。。我的错!我已经将其更新为stack…看起来您的Deck类具有修改全局文件范围变量Deck和shuffledDeck的实例方法。你确定这就是你想要的吗?看起来这些变量实际上应该是Deck类中的成员变量。很好的捕获,这不是我想要的。次要的样式问题,可能您忽略了这一点,但更喜欢index=rand%Deck_SIZE;指数=兰特%52;因为你已经有了readyin变量而不是手动洗牌,所以有一个标准的函数:。哦,gawd,我试着把它改成一个队列,但忘了把它改回来哈哈。但是队列也会发生错误。。。我的错!我已经将其更新为stack…看起来您的Deck类具有修改全局文件范围变量Deck和shuffledDeck的实例方法。你确定这就是你想要的吗?看起来这些变量实际上应该是Deck类中的成员变量。很好的捕获,这不是我想要的。次要的样式问题,可能您忽略了这一点,但更喜欢index=rand%Deck_SIZE;指数=兰特%52;既然您已经有了readyWow变量,很好的调用,我永远不会检查,因为当我尝试推送到堆栈上时会抛出异常,但这正是它。。。你知道为什么会这样吗?非常感谢。当写入超过数组末尾时,您正在损坏shuffledDeck对象。直到对象被使用并且伪对象状态导致崩溃时,才会注意到这一点。EOF问题是C/C++和其他语言中常见的反模式问题?:哇,很好的调用,我永远不会检查,因为当我尝试推到堆栈上时会引发异常,但这正是它。。。你知道为什么会这样吗?非常感谢。当写入超过数组末尾时,您正在损坏shuffledDeck对象。直到对象被使用并且伪对象状态导致崩溃,这才引起注意。EOF问题是C/C++和其他语言中常见的反模式?:和