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 :D
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.