Время компиляции - PullRequest
       24

Время компиляции

3 голосов
/ 01 июня 2010

Я пишу C для PIC32MX, скомпилированный с помощью компилятора Microchip PIC32 C (на основе GCC 3.4).

Добавлено Стандарт, которому я следую, - это GNU99 (C99 с расширениями GNU, флаг компилятора -std=gnu99)

Моя проблема заключается в следующем: у меня есть некоторые перепрограммируемые числовые данные, которые хранятся либо в EEPROM, либо во флэш-памяти программы. Это означает, что когда я хочу сохранить число с плавающей запятой, я должен выполнить несколько типов:

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
}

(На самом деле они принимают форму конструкций X macro , но это не имеет значения.) Комментировать это хорошо, но есть ли лучший способ? Было бы здорово иметь возможность сделать что-то вроде:

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 находится в глобальной области видимости. Пожалуйста, поправьте меня, если я ошибаюсь.

1 Ответ

9 голосов
/ 01 июня 2010

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

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

const IntFloat DEFAULTS[] =
{
    { .intval = 0x00000001 }, // Some default integer value, 1
    { .floatval = 0.005 }, // Some default float value, 0.005
};
...