所以我做了一个国际象棋引擎,我已经做了移动生成,当我试图计算深度时,它只上升到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,但我似乎找不到任何东西。
1条答案
按热度按时间cl25kdpy1#
你用错误的参数编写了
isupper(int c)
函数。最常见的错误是将char作为第一个参数传递。Char必须转换为unsigned char:你的代码没有它,但是一些底层函数调用了它,并且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()调用。