Об инициализации структур

Частично касаясь обсуждаемой темы. Для поддержки разметки формата хранения данных и не привязываясь к их размещению в структуре давным давно сделал примерно такое и до сих пор хватает. Можно оптимизировать, добавлять сахарку (чтобы не повторяться с именами в макросах), но тут показана сама идея.

struct t_DeviceSettings
{
  int               iIdent;
  t_KeyboardValues  KeyboardValues;
  time_t            tmLastEvent;
  unsigned long     ulPeriodSec;
  unsigned long     ulDurationSec;
  float             fFlowScale;
  unsigned long     ulWaterDoseMl;
};

#define OFFSET_SETTINGS(MEMBER) (int)(&((struct t_DeviceSettings*)0)->MEMBER)

void WriteBuffer(void *pBuffer, const int iAddr, const int iSize);
void ReadBuffer(void *pBuffer, const int iAddr, const int iSize);

...
float fFlowScaleWrite = 1.0;
WriteBuffer(&fFlowScaleWrite, OFFSET_SETTINGS(fFlowScale), sizeof(fFlowScaleWrite));

Тут прием в вычислении смещения переменной в структуре, чтобы работать только с ней (макрос). Все остальное фигня.

1 лайк