为啥我的输出在到达这部分代码时会冻结?

Posted

技术标签:

【中文标题】为啥我的输出在到达这部分代码时会冻结?【英文标题】:Why is my output freezing when it gets to this section of the code?为什么我的输出在到达这部分代码时会冻结? 【发布时间】:2019-09-03 18:09:08 【问题描述】:

我正在尝试比较两副牌,但每次我尝试另一种方法时,我都会得到相同的结果...在代码输出之前的所有内容,并且在进行比较时立即冻结代码,仿佛陷入了无限循环。

我尝试过 for 循环、静态变量、do-while 循环等。这是我第一次将循环留在客户端代码中。

本应使程序陷入无限循环的代码。

    while (repeatLoop == false)
    
        deck1.shuffleDeck();
        counter++;
        repeatLoop = deck1.compareDecks();
    

compareDecks 函数。

bool deck::compareDecks()

    int deckCount = 0;

    suitType tempOriginalSuit;
    suitType tempShuffleSuit;

    rankType tempOriginalRank;
    rankType tempShuffleRank;

    while (index < 52)
    
        tempOriginalSuit = originalCardDeck[index].getSuit();
        tempShuffleSuit = shuffledCardDeck[index].getSuit();

        if (int(tempOriginalSuit) == int(tempShuffleSuit))
        
            tempOriginalRank = originalCardDeck[index].getRank();
            tempShuffleRank = shuffledCardDeck[index].getRank();

            if (int(tempOriginalRank) == int(tempShuffleRank))
            
                deckCount++;

                if (deckCount == 52)
                    return true;
            
        
        else
        
            return false;
            index++;
        
    

shuffleDeck 函数 (此功能将第一张牌从牌组的前半部分推回,并将第一张牌从牌组的后半部分推回最后,直到所有 52 张牌都以这种模式推完。这使得牌组有 52 x 2 张牌(甲板的后半部分是完美的洗牌),所以我使用 .erase 删除卡的前半部分,因为它不需要)

void deck::shuffleDeck()

    for (int a = 0, b = 2; a < 2 && b < 4; a++, b++)
    
        for (int i = 2; i < 15; i++)
        
            shuffledCardDeck.push_back(card static_cast<cardSpace::suitType>(a),
                                             static_cast<cardSpace::rankType>(i) );

            shuffledCardDeck.push_back(card static_cast<cardSpace::suitType>(b),
                                             static_cast<cardSpace::rankType>(i) );
        
    

    shuffledCardDeck.erase(shuffledCardDeck.begin(), 
                           shuffledCardDeck.begin() + (shuffledCardDeck.size() / 2));

由这个构造函数初始化的两个卡组。

deck::deck()

    for (int i = 0; i < 4; i++)
    
        for (int j = 2; j < 15; j++)
        
            originalCardDeck.push_back(card static_cast<cardSpace::suitType>(i),
                                            static_cast<cardSpace::rankType>(j) );
            shuffledCardDeck.push_back(card static_cast<cardSpace::suitType>(i),
                                            static_cast<cardSpace::rankType>(j) );
        
    



另外请注意,我已经在另一个函数中对 shuffledCardDeck 向量进行了完美的随机播放。我正在尝试重复 perfectShuffle 函数,直到它达到原始状态并输出执行此操作所需的次数。

我得到一个无限循环。

编辑:我决定添加 return false;将 compareDecks 函数中的语句放入 if-else。另外,我认为导致问题的原因是我的索引 i 每次被再次调用时都会重置为零。你们有什么解决方案可以提出来吗?我尝试过使用静态变量,但它们不会在 for 循环中递增。

编辑 2:根据用户的要求,我将 if 语句括在花括号中,因为这是我的代码中的一个缺陷。

编辑3:注释掉后

deck1.shuffleDeck()

compareDecks 函数返回 true,表示甲板是相等的,这不应该发生......这导致循环仅在一个循环后结束。

【问题讨论】:

小心:我担心if (deckCount == 52) 会缩进。它不是if (int(tempOriginalRank) == int(tempShuffleRank)) 条件块的一部分 - 没有大括号 包围它。 如果注释掉 shuffleDeck 的用法,compareDecks 是否返回 true? 使用调试器,单步执行无限循环(或至少循环很长时间)的代码,然后弄清楚什么是楔入的。使用调试器是一项非常宝贵的编程技能。 @AngoMango 为了一笑而过,只需将其更改为 &amp;&amp;。循环的中间部分是使循环继续的条件。我想你已经被逗号操作符咬了。循环的中间部分必须是计算结果为 truefalse 的表达式。 while (repeatLoop == false) 感觉真的错了。不应该是while (repeatLoop == true)吗? 【参考方案1】:

我期待你真正洗牌。

您的代码正在将一张特定的、新合成的卡片推到牌组的末端:

           shuffledCardDeck.push_back(card static_cast<cardSpace::suitType>(a),
                                            static_cast<cardSpace::rankType>(i) );

例如,它将推出的第一张牌总是 0 中的 2(无论第 0 套是什么)。那不是你想要的。您实际上想要推送位于牌组中特定位置index 的卡片副本。例如,将index0 循环到25,然后推送shuffledCardDeck[index]shuffledCardDeck[26 + index]

那么你仍然可以使用擦除前半部分的技巧来结束。

void deck::shuffleDeck()

    for (int index = 0; index < 26; ++index) 
        shuffledCardDeck.push_back(shuffledCardDeck[index]);
        shuffledCardDeck.push_back(shuffledCardDeck[26 + index]);
    

    shuffledCardDeck.erase(shuffledCardDeck.begin(), 
                           shuffledCardDeck.begin() + 52);

【讨论】:

如果我的 shuffledCardDeck 是一个由对象组成的向量,你的方法会起作用吗?我就是这样得到的:card static_cast<:suittype>(a), static_cast<:ranktype>(i) 。我将带有特定元素的卡片对象推到矢量的末尾。 @AngoMango,是的。请注意,如果您的向量是指向对象的向量而不是对象本身的向量,但是(除了正常的 C++ 问题)是的,它会在位置 index 复制卡片结构并将该副本附加到向量的末尾 @ 987654330@。如果你分享你对向量的声明,我可以更确定地回答。 我将测试代码,但我的向量的声明在两个向量的甲板类的默认构造函数中。我将私有成员部分中的两个向量声明为:vectororiginalCardDeck; & 矢量shuffledCardDeck; @AngoMango 是的,这是card 对象的向量。那会奏效的。【参考方案2】:

您没有修改循环中的值,您使用的是双等号:

repeatLoop == deck1.compareDecks();

这可以解释你观察到的行为。

【讨论】:

我进行了更改,但我仍然遇到无限循环。但是,我将编辑问题以包含更改。

以上是关于为啥我的输出在到达这部分代码时会冻结?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 App.js 代码在保存时会自行更改?

为啥在第一次输出后控制台冻结输出?

为啥我点击计算时我的程序冻结了?

为啥我的 Python 代码在从文本文件中读取时会打印额外的字符“”?

为啥执行这些表时会出现错误1452? [复制]

为啥我的 C# 代码在回调到 C++ COM 时会停止,直到 Task.Wait/Thread.Join?