给定一个2D数组 - 我想使用原始数组中的值创建一个新数组

时间:2016-03-28 17:13:24

标签: c pointers 2d

我编写了一些代码,用于获取2D数组中四个单元格的平均值。条件是列和行必须是偶数值,如果不是,我们忽略最后一列/行。

我忘了提到这是头文件的一部分 - 在另一个包含main()的文件中,2D数组被定义为数组[x] [y]。 pastebin.com/LUXW5X6b

鉴于此,我认为最好的方法是使用指针和malloc来访问堆并进行更改。 - >我将如何实现这一目标?

uint8_t *half(const uint8_t array[],
              unsigned int cols,
              unsigned int rows) {
    // your code here
    int i, j;
    uint8_t new_rows = rows / 2;
    uint8_t new_cols = cols / 2;
    uint8_t new_array[new_rows][new_cols];
    if (new_rows % 2 != 0) {
        new_rows = new_rows - 1;
    }
    if (new_cols % 2 != 0) {
        new_cols = new_cols - 1;
    }
    for (i = 0; i < new_rows; i++) {
        for (j = 0; j < new_cols; j++) {
            new_array[i][j] = average(array[2*i][2*j],
                                      array[2*i+1][2*j],
                                      array[2*i+1][2*j+1],
                                      array[2*i][2*j+1]);
        }
    }
    return NULL;
}

1 个答案:

答案 0 :(得分:1)

您必须将参数数组声明为2D数组。在C99中,您可以使用以下语法指定尺寸:

uint8_t *half(unsigned int cols, unsigned int rows,
              const uint8_t array[][cols]) {
}

还有另一个问题:您无法在自动存储中返回指向本地数组的指针,因为该对象在函数返回后立即变为无效。一个简单的解决方案是在调用函数中分配目标数组并传递给函数half

int half(unsigned int cols, unsigned int rows,
         const uint8_t array[rows][cols],
         uint8_t output[rows / 2][cols / 2])
{
    unsigned int new_rows = rows / 2;
    unsigned int new_cols = cols / 2;

    for (unsigned int i = 0; i < new_rows; i++) {
        for (unsigned int j = 0; j < new_cols; j++) {
            output[i][j] = average(array[2 * i    ][2 * j    ],
                                   array[2 * i + 1][2 * j    ],
                                   array[2 * i + 1][2 * j + 1],
                                   array[2 * i    ][2 * j + 1]);
        }    
    }
    return 1;
}

请注意,数组作为指针传递给它们的第一个元素(它们衰减成指针),因此编译器会简单地忽略原型中的第一个维度,上面的定义等同于: / p>

int half(unsigned int cols, unsigned int rows,
         const uint8_t array[][cols],
         uint8_t output[][cols / 2]) ...

另请注意,您对new_rowsnew_cols的额外测试似乎没有必要,因为整数除法已向0舍入。如果原始数组具有奇数维,则缩减数组将正确计算,忽略最后一个行和/或列。