我编写了一些代码,用于获取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;
}
答案 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_rows
和new_cols
的额外测试似乎没有必要,因为整数除法已向0舍入。如果原始数组具有奇数维,则缩减数组将正确计算,忽略最后一个行和/或列。