所以我正在为一个更大的项目准备一个函数。此刻凌乱,但我正在经历一些非常奇怪的行为。
行为产生的代码部分如下所示:
while(rw < (startY + 3)) {
while(cl < (startX + 3)) {
if(board[rw][cl] == '*'){
char poss[9] = {'1','2','3','4','5','6','7','8','9'};
unsigned int totalcount = 0;
unsigned int possibilities = 0;
unsigned int possibleRow = 0;
unsigned int possibleCol = 0;
unsigned int lastCheck = 0;
for(unsigned int alpha = 0; alpha < 9; alpha++){
if (testGrid('r', poss[alpha], rw) == true) { totalcount++; }
if (testGrid('c', poss[alpha], cl) == true) { totalcount++; }
if (testGrid('s', poss[alpha], 0) == true) { totalcount++; }
if(totalcount == 0) { possibilities++; }
totalcount = 0;
}
std::cout << possibilities << " possibilities" << std::endl;
if(possibilities == 1) {
possibleRow = rw;
possibleCol = cl;
for(unsigned int alpha = 0; alpha < 9; alpha++){
if (testGrid('r', poss[alpha], possibleRow) == true) { lastCheck++; }
if (testGrid('c', poss[alpha], possibleCol) == true) { lastCheck++; }
if (testGrid('s', poss[alpha], 0) == true) { lastCheck++; }
if(lastCheck == 0) { board[rw][cl] = poss[alpha]; }
lastCheck = 0;
}
}
possibilities = 0;
}
cl++;
}
rw++;
cl = startX;
}
整个程序的输出解决了数独网格的一个小方块(婴儿阶段)。
但是,如果我注释掉这一行:
std::cout <输出是不同的(除了明显缺乏输出。如下所示:
显然,这是不希望的行为。但是有人可以解释吗?
pastebin:the code
pastebin:the input file
最佳答案
我相信(不幸的是,无法测试这台机器上没有C++编译器)问题出在133行,您从没有给count
赋值。如果不考虑此堆栈变量,它将继续为1,并且在以后的第149行中将通过测试。cout在当前堆栈的顶部创建多个堆栈帧,覆盖内存中的值并更改结果。将第133行更改为类似
unsigned int count = 0;
注意,声明它时,在范围中确实已经有一个count变量。完全合法,但我只是想指出这一点,以防万一,目的是使用那个,而不是制造一个新的。如果您确实想使用那个,请删除第133行。
声明原语并在您可能没有给它赋值时使用它是导致奇怪行为的秘诀。您不知道该变量在内存中有什么内容,因此从理论上讲它的值可以是完全任意的。开头可能是1,这就是这里发生的情况,因为1是以前调用函数时遗留在内存中的。
为了后代,万一pastebin(上帝禁止)死了,这是令人不安的部分:
unsigned int startY = 0;
unsigned int startX = 0;
unsigned int count; //line 133
startY = (num / 3) * 3;
startX = (num % 3) * 3;
unsigned int rw = startY;
unsigned int cl = startX;
while(rw < (startY + 3)) {
while(cl < (startX + 3)) {
if(board[rw][cl] == ident){ count = 1; }
cl++;
}
rw++;
cl = startX;
}
if(count == 1){ //line 149
return true;
} else {
return false;
}