簡體   English   中英

C ++訪問沖突寫入位置0x00000000

[英]C++ Access violation writing location 0x00000000

是的,這是家庭作業,但我不知道如何克服此錯誤。 我必須使用一個類來創建和洗牌,然后輸出其花色和值。 當我第一次運行程序時,錯誤彈出。 任何幫助,將不勝感激!

這是卡類:

#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

其他人在評論中指出了一些錯誤。 我將添加以下內容:

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

在這里,您聲明了一個由52個元素組成的數組。 有效索引從0到51,而不是52,因此for循環通過它的合適for是:

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

也就是說,使用<代替<= 使用<=您將超出范圍訪問數組,從而導致未定義的行為,例如,使用錯誤的數據甚至使程序崩潰。

而且,正如Igor所說,您有一個不指向對象的指針數組。 為此,您必須使用new 我只是想補充一點,很容易說出錯誤,因為在程序結束時您正在調用delete ,但從未調用過new

vsoftco發現的錯誤(我沒有看到)表明您沒有閱讀編譯器警告,或者它們已被禁用。 請啟用它們並閱讀它們。 即使對於有經驗的程序員,這也是一個很好的習慣。

您無需初始化卡。

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語句都應為==而不=。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM