堆栈抛出内存访问冲突 P>我想创建一个简单的扑克游戏来重新熟悉C++,因为我已经有一段时间没有玩了,想回到C++。p>
我对STL中的适当堆栈(否)有问题。我似乎无法让它允许我在堆栈中添加任何内容。每次我调用堆栈对象上的push函数时,它都会抛出内存访问冲突。。。我甚至尝试创建一个整数堆栈,并将它们添加到堆栈中,但它仍然抛出内存访问冲突错误。这很奇怪 当前将对象添加到堆栈的代码为:堆栈抛出内存访问冲突 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
//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++和其他语言中常见的反模式?:和