C ++访问冲突写入位置0x00000000

时间:2015-10-24 00:41:26

标签: c++

是的,这是家庭作业,但我不知道如何克服这个错误。我必须使用一个类来创建和洗牌一副牌,然后输出他们的套装和价值观。第一次运行程序时弹出错误。任何帮助将不胜感激!

这是卡片类:

#include "Card.h"

void Card::Set(int suit, int value)
{
m_Suit = suit;
m_Value = value;
//set the appropriate member variable
}
string Card::GetSuit()
{
if (m_Suit = 0){
    return "Spades";
}
else if (m_Suit = 1){
    return "Hearts";
}
else if (m_Suit = 2){
    return "Diamonds";
}
else if (m_Suit = 3){
    return "Clubs";
}
//returns suit based on suit variables's number
}

string Card::GetValue()
{
if (m_Value = 0){
    return "Ace";
}
else if (m_Suit = 1){
    return "2";
}
else if (m_Suit = 2){
    return "3";
}
else if (m_Suit = 3){
    return "4";
}
else if (m_Suit = 4){
    return "5";
}
else if (m_Suit = 5){
    return "6";
}
else if (m_Suit = 6){
    return "7";
}
else if (m_Suit = 7){
    return "8";
}
else if (m_Suit = 8){
    return "9";
}
else if (m_Suit = 9){
    return "10";
}
else if (m_Suit = 10){
    return "Jack";
}
else if (m_Suit = 11){
    return "Queen";
}
else if (m_Suit = 12){
    return "King";
}
//return value based on value variable's number
}

这是我的主要功能:

#include <iostream>
#include <string>
#include <time.h>
#include "Card.h"

using namespace std;

void RandomizeSeed();
int RandomRange(int min, int max);
void SwapCards(Card* a, Card* b);
//function declarations

int main()
{
RandomizeSeed();
//for a random number later
const int decknum = 52;
//# of cards in a deck
Card *deck[decknum] = {};
//a deck of card classes...?

for (int i = 0; i <= decknum; i++){
    float suit = i/13;
    float value = i%13;

    deck[i]->Set((suit), (value));
    //assign value to each card of the deck
}

for (int i = 0; i <= decknum*2; i++){
    SwapCards(deck[RandomRange(0, 51)], deck[RandomRange(0, 51)]);
    //shuffle cards

}

for (int i = 0; i <= decknum; i++){
    cout << deck[i]->GetSuit() << "of "<< deck[i]->GetValue() << endl;
//output the shuffled deck
}


for (int i = 0; i <= decknum*1; i++){
    delete deck[i];
    deck[i] = nullptr;
    //delete the cards

}

system("pause");
return 0;
}

void SwapCards(Card* a, Card* b)
{
Card temp = *a;
*a = *b;
*b = temp;
}//swap 2 cards to shuffle

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

int RandomRange(int min, int max)
{
int randomValue = rand() % (max + 1 - min) + min;
return randomValue;
} //random number function

2 个答案:

答案 0 :(得分:1)

评论中的其他人已经指出了一些错误。我将添加这个:

const int decknum = 52;
Card *deck[decknum] = {};
for (int i = 0; i <= decknum; i++){

这里声明一个包含52个元素的数组。有效索引从0到51,而不是52,因此通过它的正确for循环是:

for (int i = 0; i < decknum; i++){

即使用<代替<=。使用<=,您将从其边界访问数组,从而导致未定义的行为,例如使用错误的数据甚至崩溃程序。

而且,正如Igor所说,你有一个指针数组,它们不指向一个对象。为此,您必须使用new。我只是想补充一点,很容易说出错误,因为在程序结束时你打电话给delete,但你从未打电话给new。< / p>

vsoftco发现的错误(我没有看到)表明你没有阅读编译器警告,或者他们被禁用了。请启用它们并阅读它们。即使是有经验的程序员,这也是一个非常好的习惯。

答案 1 :(得分:1)

你永远不会初始化卡片。

Card *deck[decknum] = {};

只会将套牌初始化为0.每当您在其中一个条目上调用Set时,您将获得写入异常。虽然你确实删除了每个卡片循环。

所以你需要在初始化循环中添加一个分配,就在上面一行之后:

for (int i = 0; i < decknum; i++){ // < not <=
    deck[i] = new Card(); //<-- add this line

    float suit = i/13;
    float value = i%13;

    deck[i]->Set((suit), (value));
}

同样如vsoftco所指出的,Set和Get方法中的所有if语句都应该是== not =。

相关问题