我不知道这是否是您观察的原因,但在第 334 行,
char mirrored[BOARD_WIDTH][BOARD_HEIGHT];
for (int x = 0; x<BOARD_WIDTH; x++) {
for (int y=0; y<BOARD_HEIGHT; y++) {
mirrored[x+1-BOARD_WIDTH][y] = board[x][y];
}
}
您在分配的内存之外写入(您的行索引从-(BOARD_WIDTH)
到-1
),从而调用未定义的行为。
此外,这并不反映董事会。你很可能是说
mirrored[BOARD_WIDTH - 1 - x][y] = board[x][y];
那里。除此之外,我没有看到像越界写入这样的明显候选者。
在isBoardFinished
(第 43 行)中,您在到达第 0 行/第 0 列之前停止检查:
while (xTemp > 0)
(同样适用y
于自上而下的检查,以及对角线检查)。那应该是x >= 0
使用全板。但这不能覆盖alreadyCounter
,但它仍然可能有用。
但是在打开警告和优化的情况下编译代码显示了可能的原因:
connect-four.c: In function ‘getFirstIndex’:
connect-four.c:202:19: warning: ‘index’ may be used uninitialized in this function [-Wuninitialized]
connect-four.c: In function ‘getNewIndex’:
connect-four.c:202:19: warning: ‘index’ may be used uninitialized in this function [-Wuninitialized]
connect-four.c:199:18: note: ‘index’ was declared here
connect-four.c: In function ‘getMyIndex’:
connect-four.c:202:19: warning: ‘index’ may be used uninitialized in this function [-Wuninitialized]
connect-four.c:199:18: note: ‘index’ was declared here
connect-four.c: In function ‘makeTurns’:
connect-four.c:202:19: warning: ‘index’ may be used uninitialized in this function [-Wuninitialized]
connect-four.c:199:18: note: ‘index’ was declared here
connect-four.c:202:19: warning: ‘index’ may be used uninitialized in this function [-Wuninitialized]
connect-four.c:199:18: note: ‘index’ was declared here
所以警告和随附的注释(由于内联,它多次出现,具有不同的函数名称但位置相同)告诉我们它应该是
unsigned int getFirstIndex(char board[BOARD_WIDTH][BOARD_HEIGHT]) {
unsigned int index = 0;
// ^^^^^^^
getFirstIndex
通过调用相同的板来获得确定的结果。由于您在返回索引之前取模MAXIMUM_SITUATIONS
,因此返回的索引不应超出范围,因此不会因此而崩溃。但是当你打印出一些东西时,这可能会导致堆栈分配(不需要,参数和返回地址都index
可以在寄存器中传递),如果是这样,那会影响分配位置的位模式下次getFirstIndex
叫。这会改变返回的值,并且您在 中查找错误的插槽,因此您错过了先前出现的相同板,因此与仅产生database
该值相比,您获得的重复次数更少getFirstIndex
取决于传入的板(而不是碰巧占据特定堆栈位置的位)。
请注意 - 对于我的 gcc 版本 - 必须同时调整警告和优化才能获得警告。clang
即使将警告和优化调到最高级别,我也不会对此发出警告。其他版本的 gcc 和 clang,以及其他编译器在识别问题方面可能有不同的成功。
index
初始化为 0 in ,我得到getFirstIndex
一个一致的
########################Finish:
Maximum of 20000 reached
alreadyCounter: 4412
与是否打印字符串和优化级别无关。如果没有初始化, 的值alreadyCounter
取决于这两个因素。