Вопрос

Я пишу 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
}

... Но я полностью в потере, и я даже не знаю, возможно ли такая вещь возможна.

Примечания

  1. Очевидно, что «нет, это невозможно» является приемлемым ответом, если это правда.
  2. Я не обеспокоен переносимостью, поэтому определенное поведение в реализации - это точное, неопределенное поведение не является (у меня есть приложение IDB, сидя перед собой).
  3. Как я знаю, это должно быть преобразование времени компиляции, так как DEFAULTS находится в глобальном масштабе. Пожалуйста, поправьте меня, если я ошибаюсь об этом.
Это было полезно?

Решение

Можете ли вы сделать ваш DEFAULTS массив массива IntFloat вместо?

Если вы можете, а также Ваш компилятор поддерживает C99, тогда вы можете сделать это:

const IntFloat DEFAULTS[] =
{
    { .intval = 0x00000001 }, // Some default integer value, 1
    { .floatval = 0.005 }, // Some default float value, 0.005
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top