Seite 1 von 1
					
				Datentyp auslesen
				Verfasst: Mo Mär 10, 2014 10:33 pm
				von smith0815
				Hi
ich bin gerade dabei das Tutorial für C durch zu arbeiten.
Nun kam bei mir die Frage auf: Gibt es in C eine Möglichkeit den Datentyp auszulesen?
			 
			
					
				Re: Datentyp auslesen
				Verfasst: Mo Mär 10, 2014 10:46 pm
				von cloidnerux
				Hi
Hi und Willkommen im Forum 
 
 
Nun kam bei mir die Frage auf: Gibt es in C eine Möglichkeit den Datentyp auszulesen?
Es gibt für die Basistypen wie int, float, double in C und C++ keine Möglichkeit den Typ zu ermitteln aus unbekannten Daten. 
Es gibt die Compiler-Erweiterung "typeof" für den gcc, die aber nur zur Compilierzeit den Datentyp ermittelt.
Wirkliche Typenermittelung gibt es nur in Sprachen wie C# oder Java.
Damit zusammenhängend ist aber auch die Frage, was man mit dieser Information machen will?
 
			
					
				Re: Datentyp auslesen
				Verfasst: Mo Mär 10, 2014 10:56 pm
				von smith0815
				Das ging ja schnell, Danke.
Bei mir ging es einfach um die Frage:
Wenn ich eine Zeiger bekomme, möchte ich den Inhalt bzw. den Inhalt der Variable auf die er zeigt richtig ausgeben. So z.B. ein Ascii-Zeichen nicht als Zahl sondern als Zeichen und eine Zahl eben nicht als Zeichen.
Aber gut zu wissen, Danke.
Dann werde ich nach C eben auf C++ weiter machen.
			 
			
					
				Re: Datentyp auslesen
				Verfasst: Mo Mär 10, 2014 11:29 pm
				von mfro
				Das kann C++ auch nicht (jedenfalls nicht ohne die Mithilfe des Programmierers). Und damit geht das auch mit C:
Code: Alles auswählen
enum data_type{ int_type, double_type, int_ptr_type };
union value
{
    int _int;
    double _double;
    int *_int_ptr;
};
struct dynamic_type
{
    enum data_type t;
    union value v;
};
    
void assign(struct dynamic_type *dyn, enum data_type typ, ...)
{
    va_list va;
    va_start(va, typ);
    switch (typ)
    {
        case int_type:
            dyn->v._int = va_arg(va, int);
            break;
        case int_ptr_type:
            dyn->v._int_ptr = va_arg(va, int *);
            break;
        case double_type:
            dyn->v._double = va_arg(va, double);
            break;
    }       
    dyn->t = typ;
}
(va_arg macht "type promotion", deswegen gibt's bei float, char und short ein paar Problemchen, aber grundsätzlich geht das so)
 
			
					
				Re: Datentyp auslesen
				Verfasst: Mo Mär 10, 2014 11:51 pm
				von Xin
				smith0815 hat geschrieben:Das ging ja schnell, Danke.
Bei mir ging es einfach um die Frage:
Wenn ich eine Zeiger bekomme, möchte ich den Inhalt bzw. den Inhalt der Variable auf die er zeigt richtig ausgeben. So z.B. ein Ascii-Zeichen nicht als Zahl sondern als Zeichen und eine Zahl eben nicht als Zeichen.
Das Problem löst Du bitte mit Überladung der Ausgabe-Funktion oder durch abstrakte Klassen, die sich selbst in eine entsprechende Ausgabe transformieren.
Hier sei std::to_string<> eine Empfehlung.
 
			
					
				Re: Datentyp auslesen
				Verfasst: Di Mär 11, 2014 12:03 am
				von smith0815
				Ok, vielen Dank.
@Xin: Danke für den Tip.
Ich werde aber erst das C Tutorial fertig machen bevor ich zu C++ wechsel, zumal es ja auf dem Wissen von C aufbaut.
			 
			
					
				Re: Datentyp auslesen
				Verfasst: Di Mär 11, 2014 12:12 am
				von Xin
				smith0815 hat geschrieben:Ok, vielen Dank.
@Xin: Danke für den Tip.
Ich werde aber erst das C Tutorial fertig machen bevor ich zu C++ Wechsel, zumal es ja auf dem Wissen von C aufbaut.
Halte ich für sinnvoll.
Vorsichtig aber der Hinweis, dass unser C++ Tutorial teilweise gut ist, aber eben teilweise auch noch nicht existiert. std::to_string existiert beispielsweise nicht.