Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;混淆状态变量行为_C++_Arrays_Oop_C++11 - Fatal编程技术网

C++ c++;混淆状态变量行为

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

我有一个类“CardT”,它包含一套衣服和一个由枚举值存储的数字。为了使用纸牌,我制作了一副52张的纸牌,每张都有价值。我还有一个“tableau”类,它为纸牌tableau存储了一组这些卡片,我的board类包含了8张这些卡片的数组。将值放入数组并打印以检查正确性后,它将给出正确的输出。但是如果我在打印出完全相同的东西之后调用另一个函数,我会得到非常不同的值

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