所以我正在为一个更大的项目准备一个函数。此刻凌乱,但我正在经历一些非常奇怪的行为。

行为产生的代码部分如下所示:

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;
}

08-26 15:00