Unterschiedliche Typen in Union behandeln

Hallo,

in einer C-Eingaberoutine können sowohl Buchstabenzeichenketten als auch Zahlen (Ints, Floats) eingelesen werden, die dann, je nach Typ, in einem Union landen.

typedef union
{
float f;
int i;

} Myvalue;

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.

Wie gehe ich da am besten vor? Eine lange Schleife, die nach dem Typ der union-Komponente fragt und in Abhängigkeit davon den Größenvergleich durchführt? Oder kann man das auch geschickter machen.

Danke für jeden Tipp,
Crypto.

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

Hallo norsemanna,

zunächst vielen Dank für Deine ausführliche Antwort.

Guten Tag,

Hallo CryptoLogic,

zunächst einmal solltest du uns erklären, weshalb man denn
unbedingt eine solche Eingaberoutine verwenden muss/will.

Das ist eine Vorgabe in einem größeren Projekt, in dem diese Abfrage durchgeführt werden muss. Eine Abweichung hier hätte ziemlich viele Änderungen an anderen Stellen zur Folge.

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.

Diese Variante (Struktur mit union und mit Information über den union-Typ) werde ich anwenden.
Das Projekt ist in C erstellt, daher kann ich keine C+±Sprachelemente einsetzen.

Dein Beispielcode hat mir eingeleuchtet.

Eigentlich ist es recht kompliziert, wenn man bedenkt, dass man eigentlich „nur“ den Typen einer Strukturvariablen ermitteln muss, unter diesem Aspekt war auch meine Frage nach einer solchen Möglichkeit zu sehen.

Gruss
norsemanna

Viele Grüße,
Crypto.