Да не нужен он получается, Gamma SPb все уж написал, я лишь чутка добавлю А уж нужен union в этом случае или нет решать тебе.
Вот пример использования union
тут union самое то.
<c>
typedef union{
BYTE Byte;
short Int;
WORD Word;
DWORD Dword;
LONG Long;
FLOAT Float;
}t_UnVar;
typedef struct{
BYTE bMnuId;
t_ParOption ParOption;
t_MnuOption MnuOption;
BYTE bDataType; // Тип данных параметра
t_UnVar Var; // Значение параметра
t_UnLimit Limit; // Интервал значений
int iHeapI; // for list menu
}t_MenuItem;
int main(){
t_MenuItem MenuItem;
MenuItem.MnuOption.AutoRepeatEn=1;
MenuItem.MnuOption.OverflowEn=0;
MenuItem.MnuOption.ChangeItemEn=0;
MenuItem.bDataType=T_FLOAT;
MenuItem.Limit.Float.Min=-1999.;
MenuItem.Limit.Float.Max=MenuItem.Var.Float;
while(1){
/* SCANCode - скан-код клавиши получаем из прерывания */
ChangeItem(&MenuItem, SCANCode);
}
}
void ChangeItem(....
switch(MenuItem.bDataType){
case T_BYTE:{
int bDeltaPar;
bDeltaPar=1;
for(i=ChParStep; i; i--) bDeltaPar*=10;
switch(SCANCode){
case SCAN_LEFT_MINUS | KBD_PRESS_FLAG:{
MenuItem.Var.Byte-=bDeltaPar;
if(MenuItem.Var.Byte < MenuItem.Limit.Byte.Min ||
MenuItem.Var.Byte >= MenuItem.Limit.Byte.Max){
if(MenuItem.MnuOption.OverflowEn)
MenuItem.Var.Byte=MenuItem.Limit.Byte.Max;
else MenuItem.Var.Byte=MenuItem.Limit.Byte.Min;
}
break;
}
....
}
</c>