Hallo CryptoLogic,
zunächst einmal solltest du uns erklären, weshalb man denn unbedingt eine solche Eingaberoutine verwenden muss/will.
Zweitens: Wenn der Union mehr als einen Typ speichern können soll, so musst du entweder die Typinformation selbst verwalten oder in C++ oo-like programmieren. In C hättest du in der Regel dann ein „struct“ in dem sich ein TypInfo Feld z.B. vom Typ int oder enum befindet und dann der eigentliche Union. Im folgenden dann in C++ Notation:
#include
#include
enum typeinfo\_t
{
TYP\_NONE = 0x00
, TYP\_INT = 0x01
, TYP\_FLOAT = 0x02
, TYP\_STRING = 0x04
};
union MyValue
{
float f;
int i;
};
struct MyInputData
{
typeinfo\_t nTypeInfo;
MyValue oMyValue;
};
Nun muss ich einen Größenvergleich machen für den Fall, dass
richtige Zahlen eingegeben wurden. Der Typ der
union-Komponente kann in dem Fall entweder float sein oder
int.
#define TYP\_COMB(a,b) (((a)nTypeInfo;
int nTb = b-\>nTypeInfo;
assert(TYP\_INT == nTa || TYP\_FLOAT == nTa);
assert(TYP\_INT == nTb || TYP\_FLOAT == nTb);
switch (TYP\_COMB(nTa,nTb))
{
case TYP\_COMB(TYP\_INT,TYP\_INT): return a-\>oMyValue.i oMyValue.i; break;
case TYP\_COMB(TYP\_INT,TYP\_FLOAT): return a-\>oMyValue.i oMyValue.f; break;
case TYP\_COMB(TYP\_FLOAT,TYP\_INT): return a-\>oMyValue.f oMyValue.i; break;
case TYP\_COMB(TYP\_FLOAT,TYP\_FLOAT): return a-\>oMyValue.f oMyValue.f; break;
default:
fprintf(stderr,"illegal type combination\n");
return false;
}
}
Gruss
norsemanna