2017-02-20 81 views
5

Mam dwa kodowanym zdefiniowany jako tak (w color.h):Czy można przekazać zmienną struktury jako argument funkcji bez wcześniejszego zdefiniowania?

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

Mam następnie następujące w main.c który działa:

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

chcę móc po prostu stworzyć zmienną hsvCol wewnątrz parametry dla hsv2rgb bez konieczności tworzenia zmiennej i przekazywania jej jako parametru.

Wcześniej próbowałem każdego następnego (w miejsce dwóch liniach powyżej), niestety, z których żaden kompilacji :(

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

Moje pytanie brzmi:

  1. mogę robić to, co starałem się robić w ogóle (ale oczywiście w inny sposób)?

  2. , jeżeli 1, jak mam się za to zabrać?

+4

'rgb col = hsv2rgb ((HSV) {i /255.0, 1, 1}); ' – BLUEPIXY

+0

Aw maaan, to było takie proste! Dzięki! –

Odpowiedz

5

Możesz skorzystać z compound literal.

Cytowanie C11 rozdział §6.5.2.5 ustęp 3

Wyrażenie przyrostek, który składa się z nazwy typu nawiasach, po czym klamrę zamkniętą listę inicjalizatorów jest związek dosłownym. Dostarcza nienazwanego obiektu, którego wartość jest podana na liście inicjalizatora.

i ustęp 5

Wartość związku dosłownym jest bezimiennego obiektu inicjowane przez liście inicjatora. [...]

Więc w twoim przypadku, kod jak

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

można ponownie zapisać jako

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

Jak powiedział BLUEPIXY w komentarzach, wszystko, co musiałem zrobić, to umieścić przed moją wartością jako gipsę (hsv).

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