我试图准确理解这段代码试图完成的内容。给出了函数中位数,但是我通过将一些东西传递给函数来添加main函数和typedef / prototypes来理解它的作用。但是我可以弄清楚是什么或如何传递一些东西。我知道这个功能是某种排序。我真正需要知道的是究竟是什么传递给函数?一个N索引数组?
感谢您的指导!
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char pix_t;
pix_t median(pix_t window[N]);
int main() {
pix_t window[] = { 4, 3, 2, 1 };
pix_t output;
output = median(window[N]);
}
pix_t median(pix_t window[N])
{
pix_t t[N], z[N];
int ii, k, stage;
// copy locally
for (ii = 0; ii<N; ii++) z[ii] = window[ii];
for (stage = 1; stage <= N; stage++) {
k = (stage % 2 == 1) ? 0 : 1;
for (ii = k; ii<N - 1; ii++) {
t[ii] = MIN(z[ii], z[ii + 1]);
t[ii + 1] = MAX(z[ii], z[ii + 1]);
z[ii] = t[ii];
z[ii + 1] = t[ii + 1];
}
}
return z[N / 2];
}
答案 0 :(得分:5)
给出函数签名
pix_t median(pix_t window[N])
像
这样的电话median(window[N]);
错了。该函数需要一个pix_t
数组,其中至少有N
个元素 注意 ,而您只传递一个类型为{{{1}的变量。 1}}。
故事的士气::每当困惑时,检查数据类型
应该使用数组调用该函数,例如
pix_t
应该这样做。
注意:尽管函数签名中使用了数组符号
#define N 10 //any number
int main(void) { //note the change
pix_t window[N] = { 4, 3, 2, 1 };
pix_t output;
output = median(window); //passing the array
}
在函数内部, pix_t median(pix_t window[N]) { //....
不是数组。引用window
,章节§6.7.6.3
参数声明为''类型''的数组应调整为''限定指针 输入'',其中类型限定符(如果有)是在
C11
和[
内指定的类型限定符。 数组类型推导。 [....]
注意:
我真正需要知道的是究竟是什么传递给了这个函数?一个
]
索引数组
“至少N个元素”的含义是指保证阵列有足够的存储空间来容纳N
元素到位N
,而不是指数N-1
, N
,N+1
,N+2
有效/可寻址。
您可以将其读作:“我保证 ...
个存储空间单元格,以便我可以存储在大多数 {{1 N
有效位置中的元素。“
然而,程序员有责任手动跟踪这些细节,以避免索引到无效位置并导致分段错误;环境不会自动为您执行此操作。
答案 1 :(得分:5)
使用N
将单个元素传递给该函数。索引为N-1
的元素。哪个,取决于window[N]
的值可能超出范围。
数组自然地衰减到指向它们的第一个元素的指针,并且声明为数组作为参数的函数实际上需要一个指针。这意味着您只能使用数组名称,它将起作用:
N