2015-01-27 4 views
0

У меня есть встроенная система, которая должна хранить разные наборы результатов на основе своего состояния.C указатели вместо объединения

Одним из возможных решений является использование союза:

typedef struct 
{ 
    union 
    { 
     struct 
     { 
      double Val1; 
      double Val2; 
     } State1; 

     struct 
     { 
      double Val3; 
     } State2; 
    }; 
} strBuf; 
strBuf Buf; 

Теперь я могу хранить значения с помощью этих функций (которые я могу назвать его указателей на функции, чтобы переключить тип измерения):

void meas1(strRes* res) 
{ 
    Buf.State1.Val1 = res->v1; 
    Buf.State1.Val2 = res->v2; 
} 

void meas2(strRes* res) 
{ 
    Buf.State2.Val3 = res->v1; 
} 

Идея состоит в том, чтобы использовать состояние State1 или State2 на основе измерения.

Я думаю, что структура union является надежным способом, потому что я не могу ошибаться при распределении памяти. Нижняя сторона - это ненужное использование памяти в State2. Другим недостатком является возможность доступа к неправильной переменной.

Но только из любопытства: Как бы я сделал это с помощью указателей? И каковы преимущества и недостатки предложенного вами решения?

Редактировать:

Система генерирует значения каждые 100 мс. Они обрабатываются на RX210.

Первое состояние вычисляет из двух удвоений d1 [n], d2 [n], а предыдущие значения d1 [n-1], d2 [n-1] следующие: m = log2 (d1 [n]/d1 [п-1])/log2 (d2 [п]/d2 [п-1]) (я полагаю log2 это самый быстрый лог)

Второе состояние только вычисляет отношение двух двойников: р = d1 [n]/d2 [n]

Это означает, что мне не нужно сохранять значения n-1.

Редактировать 2: strRes - это указатель на значения, ранее используемые ранее. Что-то вроде

typedef struct 
{ 
    double v1; 
    double v2; 
} strRes; 
+0

На самом базовом уровне у вас будут указатели 'void *', содержащие адреса для структур разных типов. Более сложная форма может использовать структуры внутри структур, чтобы имитировать наследование. Ваш вопрос довольно расплывчатый, и поэтому неясно, как вы ожидаете, что ваша проблема будет решена. – user694733

+0

Что такое 'strRes' здесь? –

+0

@ Lưu Vĩnh Phúc strRes - это указатель на измеренные значения, которые содержат либо напряжение, либо ток (как двойной), либо два напряжения (как двойной). –

ответ

2

Вы можете использовать приведенный ниже код.

typedef struct { 
    double *val; 
} strBuf; 
strBuf Buf; 

void meas1(strRes* res) 
{ 
    Buf.val = malloc(2 * sizeof(double)); 
    Buf.val[0] = res->v1; 
    Buf.val[1] = res->v2; 
} 

void meas2(strRes* res) 
{ 
    Buf.val = malloc(1 * sizeof(double)); 
    Buf.val[0] = res->v1; 
} 

Плюсы: Память распределяется динамически как и при необходимости. Отсутствие ненужной потери памяти.

минусы: скорость, так как память распределена во время выполнения.

+1

Потери памяти являются спорными. Вам нужен дополнительный указатель и возможные накладные расходы 'malloc'. Но это скорее проблема с неясным вопросом, чем ваш ответ. – user694733

+0

Информация о том, где хранится динамическая память и насколько большой сегмент, нужно где-то хранить. Все это похоже на «досрочную оптимизацию» для меня. – Lundin

+0

@ user694733: W.r.t потеря памяти, он по-прежнему потребляет одну и ту же память, за исключением того, что при масштабировании есть разница. Я согласен с вами по этому вопросу, как это спорно. То же самое с дополнительными накладными расходами 'malloc' и' free'. –

Смежные вопросы