2017-02-20 43 views
5

我有兩個結構定義爲這樣(在color.h):是否可以在不事先定義它的情況下將結構變量作爲函數參數傳遞?

typedef struct rgb { 
    uint8_t r, g, b; 
} rgb; 

typedef struct hsv { 
    float h, s, v; 
} hsv; 

hsv rgb2hsv(rgb color); 
rgb hsv2rgb(hsv color); 

然後我有以下的main.c其中的工作原理:

hsv hsvCol = {i/255.0, 1, 1}; 
rgb col = hsv2rgb(hsvCol); 

我希望能夠給剛剛創建變量hsvCol內不需要創建變量並將其作爲參數傳遞給hsv2rgb的參數。

我嘗試了以下每個(代替上面的兩行),遺憾的是沒有的,其中編譯:(

rgb col = hsv2rgb({i/255.0, 1, 1}); 
rgb col = hsv2rgb(hsv {i/255.0, 1, 1}); 
rgb col = hsv2rgb(hsv hsvCol {i/255.0, 1, 1}) 
rgb col = hsv2rgb(struct hsv {i/255.0, 1, 1}); 

我的問題是:

  1. 我可以做什麼我試圖在所有做的(但顯然以不同的方式)?

  2. 如果是1,我怎麼去這樣做呢?

+4

'RGB COL = hsv2rgb((HSV){I /255.0,1,1});' – BLUEPIXY

+0

唉,真是太簡單了!謝謝! –

回答

5

您可以使用compound literal

引用C11,章§6.5.2.5,第3段,

,它由一個括號類型名稱後面封閉初始化的 列表中的支架的後綴表達式是字面的化合物。它提供了一個未命名的對象,其值由初始化程序列表給出。

和第5段,

複合文字的值是由 初始化列表初始化未命名的對象的。 [...]

所以,在你的情況,像

hsv hsvCol = {i/255.0, 1, 1}; 
rgb col = hsv2rgb(hsvCol); 

的代碼可以被重新寫爲

rgb col = hsv2rgb((hsv) {i/255.0, 1, 1}); 
        ^^^^ ^^^^^^^^^^^^^ 
        |    | 
        |    -- brace enclosed list of initializers 
        -- parenthesized type name 
0

正如BLUEPIXY在評論中所說的,我所需要做的就是將(hsv)作爲演員擺在我面前。

rgb col = hsv2rgb((hsv) {i/255.0, 1, 1}); 
相關問題