Wie erstelle ich eine Variable und füge erst später Ihren Datentypen ein ?



  • Ich muss bei einer Aufgabe dem Nutzer die Wahl lassen, ob mit Kommazahlen oder Ganzzahlen gerechnet werden soll(Datentyp int/double). Dies habe ich bis jetzt mithilfe einer If-Verzweigung getan. Nun mein Problem:
    Ich muss die erstellte Variable von der der Nutzer den Datentyp variieren kann außerhalb der If-Verzweigung speichern. Aber ich muss den Datentyp erst später einfügen sobald der Nutzer ihn bestimmt hat. Wie funktioniert das ?

    Grüße
    silent12



  • Mit einer Union:

    union IntOrFloat
    {
      float Float;
      int Int;
    };
    

    ⚠ Achtung: Die Union merkt sich nicht, welchen Teil du benutzt!



  • String, dann auf den gewünschten Datentyp casten, like:

    std::string text("3.14213123");
    
    try {
        if(choice == 'f') { /* float */ {
            float f = boost::lexical_cast<float>(text);
        } else if(choice == 'd') /* decimal */
            int d = boost::lexical_cast<int>(text);
        }
    }catch(const boost::bad_cast &ex) {
        std::cerr << "[boost::lexical_cast]: Couldn't cast '" << text << "' to " choice" << std::endl;
    }
    


  • Sry hab dich falsch verstanden. *remove above post*



  • Danke für die Antwort, aber bei wird mir ein Fehler bei dem int angezeigt. Muss davor schon irgendwas anderes davor definiert sein ?



  • Meine Kristallkugel ist gerade in Reparatur, deshalb wird es schwierig mit der Ferndiagnose 😉 Zeig doch mal den Code und die genaue Fehlermeldung des Compilers.



  • wenn er den code von dir 1 zu 1 abgetippt/geguttenbergt hat, könnte es ja sein, dass irgendein von ihm eingebundener header Int anders definiert per typdef oder makro...



  • Ich frage mich, was das ganze soll.



  • silent12 schrieb:

    Ich muss die erstellte Variable von der der Nutzer den Datentyp variieren kann außerhalb der If-Verzweigung speichern. Aber ich muss den Datentyp erst später einfügen sobald der Nutzer ihn bestimmt hat.

    Das glaube ich nicht.
    Dein Programm läßt sich bestimmt auch einfacher lösen.



  • Ich glaube ich muss das Ganze umschreiben und Präprozessor-Anweisungen verwenden


  • Mod

    silent12 schrieb:

    Ich glaube ich muss das Ganze umschreiben und Präprozessor-Anweisungen verwenden

    Wenn du deine Hausaufgaben gemacht bekommen möchtest, dann versuch bitte wenigstens selber die Aufgabenstellung zu verstehen, so dass du überhaupt nach der gewünschten Lösung fragen kannst.



  • Wann wird denn festgelegt, welcher Datentyp benutzt werden soll? Zur Laufzeit oder bereits zur Übersetzungszeit?
    Die Präprozessoranweisungen helfen dir nicht, wenn es erst zur Laufzeit entschieden werden soll, da helfen möglicherweise Templates weiter.



  • templates und laufzeit widerspricht sich in meinen augen Oo



  • SeppJ schrieb:

    Wenn du deine Hausaufgaben gemacht bekommen möchtest, dann versuch bitte wenigstens selber die Aufgabenstellung zu verstehen, so dass du überhaupt nach der gewünschten Lösung fragen kannst.

    Genau. Oder poste wenigstens die Aufgabenstellung wörtlich, statt Deiner krass unglaubwürdigen Interpretation.



  • silent12 schrieb:

    Ich glaube ich muss das Ganze umschreiben und Präprozessor-Anweisungen verwenden

    Das glaub ich nicht 😃


  • Mod

    Skym0sh0 schrieb:

    templates und laufzeit widerspricht sich in meinen augen Oo

    Er meint so etwas:

    template<typename T> void foo();
    
    if (mit_doubles)
     foo<double>();
    else
     foo<int>();
    

    Ginge im Prinzip auch nicht allzu schwer mit dem Präprozessor zu machen, aber templates sind wesentlich besser bei der Entwicklung zu handhaben.



  • Skym0sh0 schrieb:

    templates und laufzeit widerspricht sich in meinen augen Oo

    template<typename value_type>
    void rechne_rum( value_type arg1, value_type arg2 )
    {
    ...
    }
    
    int main()
    {
       if( ... ) rechne_rum<double>( 1,2 );
       else      rechne_rum<int>( 1,2 );
    }
    

    Edit:
    Gibt´s doch nicht... um 30 sec geschlagen



  • hat aber trotzdem nichts mit laufzeit zu tun...
    da steht ja schon alles beim kompilieren fest

    es werden dann nur 2 verschiedene funktionen aufgerufen



  • Skym0sh0 schrieb:

    es werden dann nur 2 verschiedene funktionen aufgerufen

    Ja und es wird zur Laufzeit entschieden welche. Nur wäre eine einfache Überladung hier wohl angebrachter..


  • Mod

    cooky451 schrieb:

    Ja und es wird zur Laufzeit entschieden welche. Nur wäre eine einfache Überladung hier wohl angebrachter..

    Es geht hier ja um 2x (oder noch öfter) die gleiche Rechnung mit unterschiedlichen Datentypen. Da sind Templates angebracht, außer du willst alles mehrfach tippen und jedes Mal die Datentypen von Hand ersetzen. Für jeden Datentyp.


Anmelden zum Antworten