Как преобразовать литерал с плавающей точкой в ​​целое число без знака с той же самой битовой комбинацией - PullRequest
1 голос
/ 27 января 2012

В заголовке вне моего контроля есть это:

typedef union {
    char * v_charp;
    int v_int;
    float v_float;
} value_t;

typedef struct var {
    char *name;
    value_t value;
} variable;

#define VARIABLE_DEF(Name, Value) {Name, {(char*)Value}}

Они ожидают, что в моем коде я сделаю что-то вроде этого:

variable my_variables[2] = {
    VARIABLE_DEF("Variable 1", 1),
    VARIABLE_DEF("Variable 2", 2)
};

Кто бы ни писал это, очевидно, не считал, что вы можете инициализировать объединение литералом с плавающей точкой. Поэтому мне нужно выяснить, как преобразовать литерал с плавающей точкой в ​​целое число с таким же битовым шаблоном. Если бы я мог использовать промежуточную переменную, это было бы легко:

float tmp;

variable my_variables[2] = {
    VARIABLE_DEF("Variable 1", tmp = 1.1f, *((unsigned int *)(&tmp))),
    VARIABLE_DEF("Variable 2", tmp = 2.2f, *((unsigned int *)(&tmp)))
};

Но вы не можете использовать переменные в инициализаторах структуры. Что еще я могу сделать?

Ответы [ 4 ]

2 голосов
/ 27 января 2012

Как насчет

variable my_variables[2] = {
    VARIABLE_DEF("Variable 1", ((value_t){.v_float = 1.1f}.v_int)),
    VARIABLE_DEF("Variable 2", ((value_t){.v_float = 2.2f}.v_int)),
};

(непроверенная)

Если подумать, как насчет определения более гибкой альтернативы VARIABLE_DEF и ее использования при необходимости?

Что-то вроде

#define VARIABLE_DEF_ALT(Name, Value) {Name, {Value}}
#define VARIABLE_DEF_ALT2(Name, Field, Value) {Name, {.Field = Value}}

variable my_variables[2] = {
    VARIABLE_DEF_ALT("Variable 1", .v_float = 1.1f),
    VARIABLE_DEF_ALT2("Variable 2", v_float, 2.2f),
};

должно работать.

Или просто пропустите макрос:

variable my_variables[2] = {
    {"Variable 1", {.v_float = 1.1f}},
    {"Variable 2", {.v_float = 2.2f}},
};

- это на самом деле макрос или вы упрощаете гораздо более сложный случай для этого обсуждения?

0 голосов
/ 27 января 2012

Используются именованные инициализаторы:

variable my_variables[2] = {
    VARIABLE_DEF("Variable 1", 1),
    { .name = "Variable 2", .value.v_float = 1.1f }
};
0 голосов
/ 27 января 2012

Вы не можете использовать такую ​​функцию из ответа Майкла Керлина в коде, потому что вызов функции нельзя использовать в инициализаторах.

Но вы можете написать программу, которая выполняет такое преобразование, а затем скопировать / вставитьв результате целочисленное значение в вашей программе!(с хорошим комментарием, говорящим, какое это действительно значение).

0 голосов
/ 27 января 2012

Может быть, такая функция, как static int f(float x) { return *(int*)&x; } подойдет?

...