所以我正在为一个更大的项目拧一个函数。此刻它很混乱,但我遇到了一些非常奇怪的行为。
我的代码中行为源自的部分如下所示:
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&lt;&lt;可能性&lt;&lt; &#34;可能性&#34; &LT;&LT;的std :: ENDL; 输出是不同的(除了明显缺乏输出。显示如下:
显然这是不受欢迎的行为。但任何人都可以解释一下吗?
pastebin:the code pastebin:the input file
答案 0 :(得分:2)
我相信(不幸的是,不能在这台机器上测试没有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;
}
答案 1 :(得分:-1)
您尚未初始化board
变量。根据您的编译器版本,您应该将定义它的行更改为
board[9][9] = { {0} };
但是,更有可能的是,您必须按如下方式创建构造函数
grid() : board{ {0} } { */empty constructor*/};
最后,我想指出c ++中的类应该按照惯例使用PascalCase;这有助于澄清Grid
是一个构造函数,因为函数永远不会以大写字母开头。