传递给函数的值与接收到的值不同

时间:2018-10-26 18:37:44

标签: c

我正在创建一个解决数独的程序,该程序为每个单元格包含一个结构,该结构包含该单元格的值和该单元格的所有可能值(以int值表示),每个位对应一个可能的值。

要更新每个单元格,我有一个名为applyMask的函数,该函数从受此单元格影响的所有其他单元格中删除与该单元格编号相对应的位。此功能在测试中可以正常工作,但是当我遍历所有单元格时,会传递大量而不是正确的数字。例如,它将正确地传递x为0和y为2,但不是传递x为0和y为3,而是传递x为4199111且y为1。在gdb中,函数传递的x为0和y是3,但是在进入该函数时会说x是4199111,y是1。该函数称为:

typedef struct Cell
{   int values;
    int value;
} cell;

void getSection(int pos, int *section1, int *section2)
{   switch(pos % 3){
    case 0:
        *section1 = pos + 1;
        *section2 = pos + 2;
    case 1:
        *section1 = pos - 1;
        *section2 = pos + 1;
    case 2:
        *section1 = pos - 2;
        *section2 = pos - 1;
    }
}

void applyMask(cell sudokuBoard[9][9], int x, int y)
{   int mask = ~(1<<(sudokuBoard[x][y].value-1));

    for(int maskP = 0; maskP < 9; maskP++)
    {   sudokuBoard[maskP][y].values &= mask;
        sudokuBoard[x][maskP].values &= mask;
    }

    int sectionX1;
    int sectionX2;
    getSection(x, &sectionX1, &sectionX2);
    int sectionY1;
    int sectionY2;
    getSection(y, &sectionY1, &sectionY2);

    sudokuBoard[sectionX1][sectionY1].values &= mask;
    sudokuBoard[sectionX1][sectionY2].values &= mask;
    sudokuBoard[sectionX2][sectionY1].values &= mask;
    sudokuBoard[sectionX2][sectionY2].values &= mask;
}

并由

调用
for(int i = 0; i < 9; i++)
    for(int j = 0; j < 9; j++)
        applyMask(sudokuBoard, i, j);

2 个答案:

答案 0 :(得分:0)

您是否熟悉关键字break及其在case的{​​{1}}部分中的使用?

此:

switch()

将始终执行switch(pos % 3){ case 0: *section1 = pos + 1; *section2 = pos + 2; case 1: *section1 = pos - 1; *section2 = pos + 1; case 2: *section1 = pos - 2; *section2 = pos - 1; } :s代码的 all ,因为它们中没有case。这被称为“跌倒”行为,有意时会非常方便。

您应该添加break,因此看起来像这样:

break

答案 1 :(得分:0)

将此行添加到getSection的末尾,您将看到缺少的中断导致* section1和* section2变为负数:

printf("pos: %d, *sec1: %d, *sec2: %d\n", pos, *section1, *section2);

这是这些输出的开始:

pos: 0, *sec1: -2, *sec2: -1
pos: 0, *sec1: -2, *sec2: -1
pos: 0, *sec1: -2, *sec2: -1
pos: 1, *sec1: -1, *sec2: 0
pos: 0, *sec1: -2, *sec2: -1
pos: 2, *sec1: 0, *sec2: 1
pos: 0, *sec1: -2, *sec2: -1

这将使sudokuBoard边界之外的applyMask访问中的这些行:

sudokuBoard[sectionX1][sectionY1].values &= mask;
sudokuBoard[sectionX1][sectionY2].values &= mask;
sudokuBoard[sectionX2][sectionY1].values &= mask;
sudokuBoard[sectionX2][sectionY2].values &= mask;