繁体   English   中英

STD :: COUT影响程序的功能

[英]STD::COUT affecting functionality of program

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

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

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 <<可能性<<“可能性” << std :: endl; 输出是不同的(除了明显缺乏输出之外。如下所示:

在此处输入图片说明

显然,这是不希望的行为。 但是有人可以解释吗?

pastebin: 代码 pastebin: 输入文件

我相信(不幸的是,无法测试这台计算机上没有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;
}

您尚未初始化board变量。 根据您的编译器版本,应将定义它的行更改为

board[9][9] = { {0} };

但是,更有可能的是,您将必须按如下方式创建一个构造函数

grid() : board{ {0} } { */empty constructor*/};

最后,我想指出,按照惯例,c ++中的类应为PascalCase。 这有助于阐明Grid是构造函数,因为函数永远不会以大写字母开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM