2017-02-20 49 views
5

İki yapılar (color.h cinsinden) böylece tanımlamış:Önceden tanımlamaksızın bir yapı değişkeni işlev argümanı olarak iletmek mümkün mü?

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

Sadece içeride değişken hsvCol oluşturmak mümkün istiyorum:

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

Sonra çalışır main.c aşağıdaki var hsv2rgb parametresi, değişkeni oluşturmak ve parametre olarak iletmek zorunda kalmadan parametreler.

  1. I Can:

    Ben hangi :(

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

    Sorum şu derlemek (yukarıdaki iki satır yerine) Aşağıdaki, ne yazık ki hiçbiri her denedim Ben (ama besbelli farklı bir şekilde) hiç yapmaya çalıştığım şeyi?

  2. ise 1, ben hakkında böylece gitmek nasıl?

+4

'rgb col = hsv2rgb ((hsv) {i olarak yeniden yazılabilir /255.0, 1, 1}); – BLUEPIXY

+0

Aw maaan, bu çok basit! Teşekkürler! –

cevap

5

compound literal'dan yararlanabilirsiniz.

teklif C11 bölüm §6.5.2.5, paragraf 3

başlatıcıdan listesini kapalı bir kuşak ardından parantez tür adı oluşan bir sonek düz ifade bir bileşiktir. Değeri başlatıcı listesi tarafından verilen adlandırılmamış bir nesne sağlar.

ve paragraf 5

hazır bileşiğin değeri, bu başlatıcı listesi ile başlatıldı isimsiz nesne olup. [...]

Yani,

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

gibi durumda, kod

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

BLUEPIXY'nin söylediği gibi, tüm yapmam gereken, (hsv) değerini döküm olarak benim değerin önüne koymaktı.

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