C++ c++;混淆状态变量行为
我有一个类“CardT”,它包含一套衣服和一个由枚举值存储的数字。为了使用纸牌,我制作了一副52张的纸牌,每张都有价值。我还有一个“tableau”类,它为纸牌tableau存储了一组这些卡片,我的board类包含了8张这些卡片的数组。将值放入数组并打印以检查正确性后,它将给出正确的输出。但是如果我在打印出完全相同的东西之后调用另一个函数,我会得到非常不同的值C++ c++;混淆状态变量行为,c++,arrays,oop,c++11,C++,Arrays,Oop,C++11,我有一个类“CardT”,它包含一套衣服和一个由枚举值存储的数字。为了使用纸牌,我制作了一副52张的纸牌,每张都有价值。我还有一个“tableau”类,它为纸牌tableau存储了一组这些卡片,我的board类包含了8张这些卡片的数组。将值放入数组并打印以检查正确性后,它将给出正确的输出。但是如果我在打印出完全相同的东西之后调用另一个函数,我会得到非常不同的值 int main(){ Board b; b.setUp(); //setUp deck and add to tab
int main(){
Board b;
b.setUp(); //setUp deck and add to tableau arrays
b.printTab(4); //print the fourth one again
}
甲板在哪里安装
void Board::setUp(){
//here i setup all 52
CardT deck[52];
int c = 0;
for (int i = 0; i <= 3; i++)
for (int j = 1; j <=13;j++){
deck[c] = CardT(static_cast<CardSuit>(i),static_cast<CardNum>(j));
c++;
}
//shuffle
std::random_shuffle(&deck[0],&deck[52]);
CardT tabls[8][13];
for (int i = 0; i < 4; i++)
for (int j = 0; j < 8; j++)
tabls[i][j] = deck[j + i*8]; //the first 4 piles that contain 8 cards
for (int i = 4; i < 8; i++)
for (int j = 0; j < 7;j++)
tabls[i][j] = deck[j + i*8]; //last four with seven
for (int i = 0; i < 4; i++)
this->tableauPiles[i] = TableauPileT(tabls[i],8); //place first four, (second param is size)
for (int i = 4; i < 8; i++)
this->tableauPiles[i] = TableauPileT(tabls[i],7); //place second four
for (int i = 0; i < 4;i++)
this->foundationPiles[i] = FoundationPileT(); //just intialize
//FOR testing
for (int j = 0; j < 13; j++){
if (this->tableauPiles[4].cardAtIndex(j)){
std::cout << this->tableauPiles[4].getCardByIndex(j).getNum() << ",,,," << this->tableauPiles[4].getCardByIndex(j).getSuit() << std::endl;
}
}
//printed twice for assurance, both print as expected
for (int j = 0; j < 13; j++){
if (this->tableauPiles[4].cardAtIndex(j)){
std::cout << this->tableauPiles[4].getCardByIndex(j).getNum() << ",,-,," << this->tableauPiles[4].getCardByIndex(j).getSuit() << std::endl;
}
}
}
最后这就是我给出的输出
1,,,,1
12,,,,2
4,,,,0
4,,,,1
4,,,,2
5,,,,3
10,,,,0
1,,-,,1
12,,-,,2
4,,-,,0
4,,-,,1
4,,-,,2
5,,-,,3
10,,-,,0
1,,Third,,1
0,,Third,,1
0,,Third,,0
32545,,Third,,1284192187
0,,Third,,10
32767,,Third,,1922833024
0,,Third,,0
打印的值存储为enum
P>在打印语句之间有明显的改变,对C++非常新,但是在其他方面有C经验。任何帮助都是非常感谢的,因为我已经疯了
另外,我正在打印第四堆,我相信0-3堆都打印正确,只有4+被弄乱了
同样值得注意的是,较大的意外值在执行之间发生变化,其余保持不变。您的卡表(cardtable[8][13];
)在您的Board::setUp()
方法的堆栈上声明
然后将指向这些对象的指针存储在TableauPileT对象中。
这适用于调试代码,因为它们仍然在堆栈上,
但在调用printTab
函数时,它们已被释放
因此,此时您正在读取内存中剩余的内容,这意味着您将获得未定义的行为。您的卡表(cardtable[8][13];
)在Board::setUp()
方法的堆栈上声明
然后将指向这些对象的指针存储在TableauPileT对象中。
这适用于调试代码,因为它们仍然在堆栈上,
但在调用printTab
函数时,它们已被释放
因此,你只是在读取当时内存中剩余的内容,这意味着你得到了未定义的行为。洗牌后的第二个循环:为什么你要将i乘以8,而牌堆只有6张?显然超出了数组边界。应该是
[j+4+i*6]
。顺便说一下,前4堆只有7张牌长,i乘以8是错误的。在那些开始循环的表中,j应该分别小于7和6,而不是8和7。洗牌后的第二个循环:为什么你要将i乘以8,而牌堆只有6张?显然超出了数组边界。应该是[j+4+i*6]
。顺便说一下,前4堆只有7张牌长,i乘以8是错误的。在那些表初始化循环中,j应该分别小于7和6,而不是8和7。当您对卡进行赋值时,例如,像this->tableauPiles[i]=TableauPileT(tabls[i],8),为什么要转换这一行std::cout tableauPiles[4].getCardByIndex(j).getNum()代码>您正在进行深度复制吗?如果不是这样的话,这些东西就不在范围之内了,而且你看到的是随机记忆,那么你发布的代码就没有问题了。你能试着准备一份吗?把所有东西放在一个文件里,删除不需要的东西@AndreasHaferburg您只需在您的评论中添加[mcve]
,它将生成如下链接:@melpomene Cool,谢谢。)当你对卡片进行赋值时,例如,像this->TableauPileT[i]=TableauPileT(tabls[i],8),为什么要使用这一行std::cout TableauPileT[4].getCardByIndex(j).getNum()代码>您正在进行深度复制吗?如果不是这样的话,这些东西就不在范围之内了,而且你看到的是随机记忆,那么你发布的代码就没有问题了。你能试着准备一份吗?把所有东西放在一个文件里,删除不需要的东西@AndreasHaferburg您只需在您的评论中添加[mcve]
,它将生成如下链接:@melpomene Cool,谢谢。)好的,有道理,我的时间间隔,因为c显示得很清楚。我该怎么做一个深拷贝呢?或者它需要明确地完成吗?我建议最好在TableauPile中使用std::vector。如果不是这样,那么将tabls声明为Board对象的成员,而不是堆栈上的成员代码>将成为板对象的一部分。您的问题是TableauPileT
有一个指向卡片列表的指针,这些卡片在堆栈上。当从方法返回时,这是随机内存。好的,我的时间间隔,因为c显示得很清楚。我该怎么做一个深拷贝呢?或者它需要明确地完成吗?我建议最好在TableauPile中使用std::vector。如果不是这样,那么将tabls声明为Board对象的成员,而不是堆栈上的成员代码>将成为板对象的一部分。您的问题是TableauPileT
有一个指向卡片列表的指针,这些卡片在堆栈上。当从方法返回时,这是随机记忆。是的,我改变了所有的范围,这样一旦打印开始工作,我就可以看到了。非常感谢。不客气。但最有可能的是,我不会写这样的代码。为了提高这段代码的质量,可以做很多工作,但是我太老了,我改变了所有的范围,一旦打印工作开始,我就可以看到了。非常感谢。不客气。但最有可能的是,我不会写这样的代码。为了提高这段代码的质量,可以做很多工作,但我太老了
#ifndef BOARD_H
#define BOARD_H
class Board{
private:
CardT freeCells[4];
bool freeCellsOpen[4] = {false,false,false,false};
FoundationPileT foundationPiles[4];
TableauPileT tableauPiles[8];
int cardPosition(CardNum n, CardSuit s);
int emptyFreeCell();
public:
Board();
void setUp();
void moveToFreeCell(CardNum n, CardSuit s);
void moveToTableau(CardNum n, CardSuit s, int tableau);
void moveToFoundation(CardNum n, CardSuit s);
void printBoard();
void printTab(int i);
};
#endif
1,,,,1
12,,,,2
4,,,,0
4,,,,1
4,,,,2
5,,,,3
10,,,,0
1,,-,,1
12,,-,,2
4,,-,,0
4,,-,,1
4,,-,,2
5,,-,,3
10,,-,,0
1,,Third,,1
0,,Third,,1
0,,Third,,0
32545,,Third,,1284192187
0,,Third,,10
32767,,Third,,1922833024
0,,Third,,0