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