c++ 尝试进入深度时,国际象棋引擎验证Assert失败

2lpgd968  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(99)

所以我做了一个国际象棋引擎,我已经做了移动生成,当我试图计算深度时,它只上升到3。
如果我向上到4,它抛出this错误。

#include <vector>
#include "ChessBoard.h"

std::vector<ChessBoard> generatePositionsToDepth(const ChessBoard& initialBoard, int depth) {
    std::vector<std::vector<ChessBoard>> positions(depth + 1);
    positions[0].push_back(initialBoard);

    for (int d = 1; d <= depth; d++) {
        for (const ChessBoard& board : positions[d - 1]) {
            ChessBoard boardCopy = board;
            boardCopy.generateMoves(); // Generate moves makes a vector with all the new positions as ChessBoard classes
            const std::vector<ChessBoard>& newPositions = boardCopy.getPositions(); // And getPositions returns the vector
            positions[d].insert(positions[d].end(), newPositions.begin(), newPositions.end());
        }
    }

    return positions[depth];
}

我对C++有点陌生,所以我不太了解像这样的调试。我试着用谷歌搜索一些解决方案并使用ChatGPT,但我似乎找不到任何东西。

cl25kdpy

cl25kdpy1#

你用错误的参数编写了isupper(int c)函数。最常见的错误是将char作为第一个参数传递。Char必须转换为unsigned char:

isupper(static_cast<unsigned char>(c))

你的代码没有它,但是一些底层函数调用了它,并且assert在释放模式下被调用(在释放模式下-忽略它并创建未定义的行为)。你可以按下按钮,转到编译器,在MSVC IDE中点击堆栈窗口,一步一步地点击堆栈中的函数,找到这个函数的调用。这个电话必须被固定。
以char为第一个参数调用isspace()islower()isupper()是一个常见的错误。
isupper(int c)只需要整数参数-1(int c)或0..255。如果你把char参数传递给isupper,那么从-127到-2的所有char值都被转换为int-127..-2,这是错误的,会导致库的assert模式。所有不在-1..255范围内的值都会产生未定义的行为(随机返回值、访问错误或不存在的内存、分段错误等)。检查程序中的所有isupper()调用。

相关问题