2017-02-20 6 views
5

私は2つの構造体は、(color.hに)なるように定義されています:構造変数を前もって定義することなく関数の引数として渡すことはできますか?

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

は、私はちょうど内部変数hsvColを作成できるようにしたい:

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に次のように持っています変数を作成してパラメータとして渡す必要なく、hsv2rgbのパラメータ。

  1. 私がすることができます

    は、私はその:(

    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}); 
    

    私の質問があり、コンパイル(上記の2行の代わりに)以下、悲しげなしのそれぞれを試してみました私はすべてでやろうとし(ただし、明らかに異なる方法で)されたものですか?

  2. 1場合は、どのように私はそうやって行くのですか?

+4

'RGB COL = hsv2rgb((HSV){Iのように書き換えることができます/255.0,1,1}); ' – BLUEPIXY

+0

Aw maaan、それはとてもシンプルでした!ありがとう! –

答えて

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}); 
関連する問題