Сборное время поплавка упаковка / наказы
-
05-10-2019 - |
Вопрос
Я пишу C для PIC32MX, скомпилирован с помощью компилятора Microchip PIC32 C (на основе GCC 3.4).
Добавлен Стандарт, который я следую, является GNU99 (C99 с расширениями GNU, флаг компилятора -std=gnu99
)
Моя проблема в том, что у меня есть несколько перепрограммируемых числовых данных, которые хранятся либо на EEPROM, либо в программе Flash из чипа. Это означает, что когда я хочу хранить поплавок, я должен сделать какой-то тип наказы:
typedef union
{
int intval;
float floatval;
} IntFloat;
unsigned int float_as_int(float fval)
{
IntFloat intf;
intf.floatval = fval;
return intf.intval;
}
// Stores an int of data in whatever storage we're using
void StoreInt(unsigned int data, unsigned int address);
void StoreFPVal(float data, unsigned int address)
{
StoreInt(float_as_int(data), address);
}
Я также включаю значения по умолчанию в качестве массива констант времени компиляции. Для (без знака) целочисленные значения это тривиально, я просто использую целочисленную буквальную букву. Однако для поплавков я должен использовать этот фрагмент Python, чтобы преобразовать их в свое слово представление, чтобы включить их в массив:
import struct
hex(struct.unpack("I", struct.pack("f", float_value))[0])
... и поэтому мой массив по умолчанию имеет эти неразъемные значения, такие как:
const unsigned int DEFAULTS[] =
{
0x00000001, // Some default integer value, 1
0x3C83126F, // Some default float value, 0.005
}
(Они на самом деле принимают форму Х макрос Конструкции, но это не имеет значения здесь.) Комментирование приятно, но есть ли лучший способ? Будьте здоровы, чтобы иметь возможность сделать что-то вроде:
const unsigned int DEFAULTS[] =
{
0x00000001, // Some default integer value, 1
COMPILE_TIME_CONVERT(0.005), // Some default float value, 0.005
}
... Но я полностью в потере, и я даже не знаю, возможно ли такая вещь возможна.
Примечания
- Очевидно, что «нет, это невозможно» является приемлемым ответом, если это правда.
- Я не обеспокоен переносимостью, поэтому определенное поведение в реализации - это точное, неопределенное поведение не является (у меня есть приложение IDB, сидя перед собой).
- Как я знаю, это должно быть преобразование времени компиляции, так как
DEFAULTS
находится в глобальном масштабе. Пожалуйста, поправьте меня, если я ошибаюсь об этом.
Решение
Можете ли вы сделать ваш DEFAULTS
массив массива IntFloat
вместо?
Если вы можете, а также Ваш компилятор поддерживает C99, тогда вы можете сделать это:
const IntFloat DEFAULTS[] =
{
{ .intval = 0x00000001 }, // Some default integer value, 1
{ .floatval = 0.005 }, // Some default float value, 0.005
};