2017-04-21 29 views
2

我想明白這段代碼試圖完成什麼。給出了函數中值,但我通過向函數傳遞某些東西來添加主函數和typedef/prototypes,以便理解它的功能。但是我可以弄清楚什麼或如何傳遞給它。我明白這個功能是某種類型的。我真正需要知道的是正在傳遞給函數的是什麼? N個索引的數組?你如何將數組傳遞給像這樣的函數:void fooboo(char array [i]);

謝謝你的指導!

#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]; 
} 
+4

不知道如果我只是想念它,但在哪裏'N'定義?似乎它甚至不會編譯。 – ray

+0

另外,'median'函數期望有一個'pix_t'數組,但是您發送的是單個標量值。 – ray

回答

5

由於函數簽名

pix_t median(pix_t window[N]) 

呼叫像

median(window[N]); 

是錯誤的。該函數需要至少包含pix_tN元素注意,而您只傳遞一個類型爲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不是陣列。引用C11,章§6.7.6.3

一個參數作爲「」「類型的陣列」的聲明,應調整至「」合格指針 類型「」,其中類型限定符(如果有的話)是在 陣列類型推導的[]內指定的那些。 [...]


注:

我真正需要知道的是究竟是在傳遞什麼功能?一組N索引?

「至少N個元素」的含義指的是一個保證所述陣列具有足夠的存儲空間來容納N元件至位置N-1,而不是指數NN+1N+2...是有效的/尋址。

你可以把它讀作:「我的存儲空間在至少N細胞的保證,這樣我可以在N-1有效位置N元店」。

但是,程序員有責任手動跟蹤這些詳細信息,以避免索引到無效位置並導致分段錯誤;環境不會自動爲你做。

+1

「該函數需要一個至少包含N個元素的pix_t數組」。這看起來不正確。它具有*最* * N-1個元素; 「至少」,那麼它意味着你可以索引'N','N + 1'等等,這只是段錯誤。 – ray

+0

@ray我不確定。我讀過它,「它保證指針至少允許」N-1「有效索引」,儘管這是由程序員強制執行的,而不是標準的。 –

+0

我想我明白你的意思,但你至少可以澄清,「至少」是指可索引空間的保證,而不是「至少」X-1「,因此可以安全地索引到」X ','X + 1'等「 – ray

5

With window[N]您將單個元素傳遞給函數。索引爲N的元素。其中,根據N的值可能會超出範圍。

數組自然衰減到指向它們的第一個元素的指針,並且函數被聲明爲接受一個數組作爲實際參數需要一個指針。這意味着你可以只使用數組名稱,它將工作:

median(window); 
相關問題