【问题标题】:C: Nested loop over 2d array giving unexpected resultC:二维数组上的嵌套循环给出了意想不到的结果
【发布时间】:2020-04-24 17:29:53
【问题描述】:

这是该问题的最小可重现示例。 将高度和长度作为参数(而不是计算它们)是经过深思熟虑的。

typedef struct
{
    int red;
} triple;

int main(void)
{
    triple array[3][3] = {
      { {.red = 10}, {.red = 40}, {.red = 70}},
      { {.red = 110}, {.red = 120}, {.red = 130}},
      { {.red = 200}, {.red = 220}, {.red = 240}}
    };

printarray(2, 2, array);
}


void printarray(int height, int length, triple array[][length])
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < length; j++)
        {
            printf("red score at array[%i][%i] = %i\n", i, j, array[i][j].red);
        }
    }
}

我得到的输出是:
数组 [0][0] 处的红色分数 = 10
数组 [0][1] 处的红色分数 = 40
数组 [1][0] 处的红色分数 = 70
数组 [1][1] 处的红色分数 = 110

但我希望:
数组 [0][0] 处的红色分数 = 10
数组 [0][1] 处的红色分数 = 40
数组 [1][0] 处的红色分数 = 110
数组 [1][1] 处的红色分数 = 120

二维数组的索引显然没有像我预期的那样工作,但是为什么?

【问题讨论】:

    标签: c arrays multidimensional-array cs50


    【解决方案1】:

    您将2,2 传递给printarray。这是height,length

    但是,数组是定义的,长度为3。因此,您必须3 传递给printarray 作为长度。

    否则,printarray 中的索引不正确。正如您所拥有的,printarray 中的数组等效于 triple array[2][2]not triple array[3][3] 是必需的。

    height 可以小于定义的高度,但length 必须匹配。这里,length步幅。这是给定行中的元素数。

    所以,在main 中,拨打:printarray(3,3,array)


    如果您真的希望打印数组的一个子部分,则需要将一个单独的变量传递给printarray 以获取步幅。

    函数必须声明为:

    void printarray(int height, int length, int stride, triple array[][stride])
    

    然后,在main 中调用它:

    printarray(2,2,3,array);
    

    【讨论】:

    • 是的,当然这是问题所在,我怎么看不到它。谢谢你:)
    【解决方案2】:

    问题在于您致电printarray

    printarray(2, 2, array);
    

    您告诉函数该数组有两行和两列 - 但它没有,它有三行和三列。编译器假定你不会说谎!

    必须使用length 参数的正确值调用您的函数,因为编译器使用它来推断如何计算元素array[i][j] 的偏移量。

    如果您只想打印该数组的 部分,则应指定要打印的列数和行数作为函数的额外参数,如下所示:

    void printarray(int height, int length, int nrows, int ncols, triple array[][length])
    {
        if (nrows > height) nrows = height;
        if (ncols > width) ncols = width;   // Prevent error conditions!
        for (int i = 0; i < nrows; i++) {
            for (int j = 0; j < ncols; j++) {
                printf("red score at array[%i][%i] = %i\n", i, j, array[i][j].red);
            }
        }
    }
    

    然后像这样调用函数:

        printarray(3, 3, 2, 2, array);
    

    注意:在使用之前,您还缺少printarrayfunction prototype,这在某些编译器上会出错(但在其他编译器上只会出现警告);在 main 函数之前添加这一行:

    void printarray(int height, int length, int nrows, int ncols, triple array[][length]);
    

    【讨论】:

    • 非常感谢您的指导,我意识到我的问题并解决了它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2020-05-07
    • 2019-01-07
    • 2011-07-21
    相关资源
    最近更新 更多