【问题标题】:C: Function with matrix as argument prints out wrong when the matrix dimensions are odd numbersC:当矩阵维数为奇数时,以矩阵为参数的函数打印错误
【发布时间】:2021-06-11 16:17:09
【问题描述】:

所以我创建了一个以矩阵为参数的函数。矩阵由 0 和 1 组成。此函数的目标是逐个读取矩阵值,如果它们是 0,则打印出“~”,如果它们是 1,则打印“B”,如果它们是 0,则在 a 旁边1 水平打印一个“]”。

函数如下:

void canvas(int m[t1][t2]){

    for (int i = t1 - 1; i > -1; i--)
    {
        for (int j = 0; j < t2; j++)
        {
            if (m[i][j] == 1){
                printf("B ");
            }
            else if (m[i][j] == 0 && (m[i][j + 1] == 1 || m[i][j - 1] == 1)){
                printf("] ");
            }
            else {
                printf("~ ");
            }
        }
        printf("\n");
    }
}

这是用作参数的矩阵的样子(例如 13 x 13):

0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 1 1 1 1 1 1 1 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 0 1 0 0 0 
0 1 1 1 1 1 1 1 1 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 

这是我预期的输出:

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
] B B B B B B B B B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B B B B B B B B B ] ~ ~ 
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 

这就是我得到的:

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ] 
] B B B B B B B B B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B ] ~ ~ ~ ~ ~ ] B ] ~ ~ 
] B B B B B B B B B ] ~ ~ 
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 

当矩阵的两个维度都是奇数时,第一行的最后一个字符总是出现错误,我不知道为什么。我认为这可能与逻辑表达式有关,但找不到奇数发生这种情况的原因。

【问题讨论】:

  • t1t2的定义在哪里?
  • @M.NejatAydin 文件顶部,函数外

标签: arrays c function matrix


【解决方案1】:

当您执行此检查时:

else if (m[i][j] == 0 && (m[i][j + 1] == 1 || m[i][j - 1] == 1)){

j 为 0 或 t2-1 时,您读取数组的末尾。这样做会触发undefined behavior

您需要对这些情况进行额外检查:

else if (m[i][j] == 0 && ((j < t2-1 && m[i][j + 1] == 1 ) || 
                          (j > 0) && m[i][j - 1] == 1)) {

【讨论】:

  • 这解决了问题,但你知道为什么它只发生在奇数上吗?这仍然困扰着我...:/
  • @Tastefool 这就是未定义行为如何表现的一部分。它会导致程序无法预测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 2018-08-05
  • 2023-03-25
  • 2011-07-01
  • 2020-03-19
  • 2022-01-16
相关资源
最近更新 更多