C++ 循环在多次(非常精细)迭代后崩溃/损坏

C++ 循环在多次(非常精细)迭代后崩溃/损坏,c++,arrays,pointers,for-loop,C++,Arrays,Pointers,For Loop,我正在为一个学校项目做一个程序,该项目旨在输出21点游戏中的所有牌值,并告诉你一些关于这些牌的可能组合的事情 该循环设计用于将一张卡放入手牌,并在放入另一张卡之前检查一些不同的可能性,然后执行相同的操作。当达到五张卡时,它清除手牌并移动到一组新的卡值,直到它使用了牌组中的所有卡 现在每第四张和第五张牌都会在循环过程中被打破。请记住,尽管我正在使用指针、数组和类(以及更多),但我仍然不能完全理解所有的事情,即使我已经通读了《C++早期对象第八版》一书,直到第10章 这是一个发生的输出示例,它表明记

我正在为一个学校项目做一个程序,该项目旨在输出21点游戏中的所有牌值,并告诉你一些关于这些牌的可能组合的事情

该循环设计用于将一张卡放入手牌,并在放入另一张卡之前检查一些不同的可能性,然后执行相同的操作。当达到五张卡时,它清除手牌并移动到一组新的卡值,直到它使用了牌组中的所有卡

现在每第四张和第五张牌都会在循环过程中被打破。请记住,尽管我正在使用指针、数组和类(以及更多),但我仍然不能完全理解所有的事情,即使我已经通读了《C++早期对象第八版》一书,直到第10章

这是一个发生的输出示例,它表明记分员记分正确,但放在手上的卡在循环的第五次迭代中开始出错,这似乎反映在分数中

AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC

AH2H3H4H5H6H7H8H9HTHJHQHKH

AD 2D 3D 4D 5D 6D 7D 8D 9D TD JD QD KD

同2s3s4s5s6s7s8s9sJSQSKS

AC:AC:1:11:0:0:1:1

2C:AC2C:3:13:0:0:2:1

3C:AC2C3C:6:16:0:0:3:1

4C:AC2C3C4C:10:20:0:0:4:1

5C:AC2C3C AC:7:20:0:1:5:0

清理手

6C:6C:6:6:0:0:1:1

7C:6C7C:13:13:0:0:2:1

8C:6C7C8C:21:21:0:0:3:1

9C:6C7C8C9C:30:30:1:0:4:1

TC:6C7C8C C6C:27:27:1:1:5:0

……这里还有几个,但我把它们拿出来了,因为它一次又一次地出现在同一个问题上

清理手

QS:QS:10:10:0:0:1:1

KS:QSKS:20:20:0:0:2:1

…就在这里,它崩溃了,而不是完成手

为了让它更容易阅读,我将告诉你每一部分(用冒号分隔)在一行中代表什么

((显示第一张/下一张卡)X:0:0:0:0:0:0:0:0:0

(显示手里的任何东西)0:X:0:0:0:0:0:0:0

(假设任何A都是1的分数)0:0:X:0:0:0:0:0:0:0

(假设手上第一张A是11分,其他都是1分)0:0:0:X:0:0:0:0:0:0

(表示手是否半身像的布尔值)0:0:0:0:X:0:0:0:0

(代表一手完整的牌)0:0:0:0:0:X:0:0

(手中的牌数)0:0:0:0:0:0:0:X:0

(确定是否可以提取另一张卡的布尔值)0:0:0:0:0:0:0:X

最上面的部分只是显示所有可能的卡值,并且似乎工作正常。我想知道的是,为什么第五次迭代似乎很难将第四张牌单独留下,而没有弄乱第五张牌,当然,为什么它会崩溃。这是我的密码

我的主文件必须是正确的,因为老师给了我们,我们不应该弄乱它:

 #include <iostream>
 #include "BlackJackHand.h"
 #include "PlayingCard.h"

using namespace std;

int main() {

  // Create a Blackjack hand object
   BlackJackHand myHand;

  // arrays of values and suits for normal cards
   char
     *values = "A23456789TJQK",
     *suits = "CHDS";

  const int DECK_SIZE = 52;
   const int SUIT_SIZE = 13;
   PlayingCard *deck[DECK_SIZE]; // array of pointers to class objects

  // Initialize and display a card deck
   int
     i,
     j;

  for(i = 0; i < 4; i++) {
     for(j = 0; j<SUIT_SIZE; j++) {
       deck[i * SUIT_SIZE + j] = new PlayingCard(values[j], suits[i]);
       cout << deck[i * SUIT_SIZE + j]->getCardCode();
       cout << " ";
     }
     cout << endl;
   }
   cout << endl;

  // Add each from deck to hand, then remove card from hand
   // before adding next card. Check funcs.
   for(i = 0; i < DECK_SIZE; i++) {
     cout << deck[i]->getCardCode();
     myHand.addCard(deck[i]);
     deck[i] = NULL;  // Remove card from deck
     cout << " : ";
     cout << myHand.getAllCardCodes();
     cout << " : " << myHand.getLowScore()
       << " : " << myHand.getHighScore()
       << " : " << myHand.isBust()
       << " : " << myHand.isFull()
       << " : " << myHand.getCardCount()
       << " : " << myHand.canTakeCard()
       << endl;
     if(!myHand.canTakeCard()) {
         cout << "\nClearing hand\n";
         myHand.clearHand();
     }
   } // end for

  cout << "\nClearing hand\n";
   myHand.clearHand();

  PlayingCard
     *card1 = new PlayingCard('J', 'C'),
     *card2 = new PlayingCard('A', 'S'),
     *card3 = new PlayingCard('A', 'D');


  BlackJackHand hand2 = BlackJackHand(card1,card2);
   card1 = card2 = 0;
   cout << hand2.getAllCardCodes();
   cout << " : " << hand2.getLowScore()
     << " : " << hand2.getHighScore()
     << " : " << hand2.isBust()
     << " : " << hand2.isFull()
     << " : " << hand2.getCardCount()
     << " : " << hand2.canTakeCard()
     << endl;

  cout << "\nAdding a second ace:\n";

  hand2.addCard(card3);
   card3 = 0;
   cout <<hand2.getAllCardCodes();
   cout << " : " << hand2.getLowScore()
     << " : " << hand2.getHighScore()
     << " : " << hand2.isBust()
     << " : " << hand2.isFull()
     << " : " << hand2.getCardCount()
     << " : " << hand2.canTakeCard()
     << endl;

    for (int i = 0; i < DECK_SIZE; i++)
         if (deck[i] != NULL)
             delete deck[i];

  return 0;
 } // end main
#包括
#包括“BlackJackHand.h”
#包括“PlayingCard.h”
使用名称空间std;
int main(){
//创建21点手对象
黑手我的手;
//普通卡的值数组和套装
烧焦
*values=“A23456789TJQK”,
*诉讼=“CHDS”;
甲板内部构件尺寸=52;
服装尺寸=13;
PlayingCard*deck[deck_SIZE];//指向类对象的指针数组
//初始化并显示卡片组
int
我
J
对于(i=0;i<4;i++){

对于(j=0;j好的,这可能需要几次迭代。让我们看看……当我启动
PlayingCard
并运行代码时,它不会崩溃。您说它会在以下时间后崩溃:

KS : QSKS : 20 : 20 : 0 : 0 : 2 : 1
这应该是牌组的结尾。在我的版本中,它继续清理牌组并制作一些新的牌。让我们确定它在这里崩溃。(我怀疑不是)。在代码中添加几行代码:

} // end for

cout << "deck is empty" << endl;

cout << "\nClearing hand\n";
myHand.clearHand();

cout << "done" << endl;
}//结束

您的代码太长了。请确保您没有越界访问。您需要先缩小范围!因此不是调试服务!
if(getLowScore()<21 | | getLowScore())<21
似乎您希望其中一个是不同的函数,根据您的逻辑,您可以将一张卡添加到一手牌中,只要总数小于21。我认为您超出了数组的范围。我还鼓励您使用
进行大小比较,因为一旦您将一张卡错误地添加到fu中我会交给你的,因为精确的尺寸比较,它将不再完整。谢谢大家的快速反应,我会尽量缩小范围,但我很难做到这一点,因为我不知道我到底在做什么。我会试试你的建议退休忍者!一个是高分的,不确定我什么时候把它弄糟了。我改变了isfull()函数来检查它是否大于或等于5,因此它应该是一个更好的过滤器,但它仍然在同一个地方崩溃,并且执行相同的迭代错误我不确定您打算将此代码放在哪里,我不能将其添加到main,因为我根本不允许更改主文件…@DiJiT:复制主文件,然后monkey w为了测试的目的。我们不会告诉你。我不知道崩溃是不是正确的词,但是程序在我的计算机上在那一点之后“死亡”。好的,我会试试这个:)@DiJiT:如果它不继续说“清除手”并开始制作{JK,AS,AD}手,那么那里就出了问题。
KS : QSKS : 20 : 20 : 0 : 0 : 2 : 1
} // end for

cout << "deck is empty" << endl;

cout << "\nClearing hand\n";
myHand.clearHand();

cout << "done" << endl;
int main() {

  // CUT!

  PlayingCard
  *card1 = new PlayingCard('J', 'C'),
  *card2 = new PlayingCard('A', 'S'),
  *card3 = new PlayingCard('A', 'D');

  ...
    << endl;

  // comment these lines out, since the deck no longer exists:
  //  for (int i = 0; i < DECK_SIZE; i++)
  //    if (deck[i] != NULL)      
  //      delete deck[i];
  return 0;
} // end main