Стек выбрасывает нарушение доступа к памяти

Поэтому я пытаюсь создать простую игру в покер, чтобы заново познакомиться с 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();

};
}

2

Решение

Вы, вероятно, пишете после конца deck массив в loadCards()портит память.

Даже если у вас есть ровно 52 строки данных, cardlist.good() вернусь true до тех пор после EOF индикация.

Возможно, вы захотите попробовать следующий цикл (не проверено):

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]