2017-02-20 10 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 цв = hsv2rgb ((ВПГ) {Я /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});