cin-Prüfung mit TryParse



  • Hallo zusammen,

    ich habe eine generelle Frage zur Verwendung von TryParse. Ich möchte hiermit gerne meine Eingabe überprüfen.

    Ich programmiere mit Visual Studio 2010 und habe nach Recherche für meine Win32 Konsolenanwendung in den Projekteigenschaften bereits die /clr Unterstützung aktiviert - ist, wenn ich das richtig verstanden habe, notwendig, um den namespace System verwenden zu können.

    Meine aktuelle Funktion habe ich mir quasi aus der Microsoft Hilfe abgeleitet:

    using namespace System;
    
    bool IstZahl(String^ value){
    	Int32 number;
    	bool result = Int32::TryParse(value, number);
    	if (result)
    		return true;
    	else
    		return false;
    }
    

    Der Aufruf erfolgt an dieser Stelle im Hauptprogramm:

    int zaehler;
    
    // Eingabe
    		do{
    			cout << "Bitte den Zaehler eingeben: ";
    			cin >> zaehler;
    		} while (!IstZahl(zaehler));
    

    Visual Studio meldet mir nun als Fehlermeldung für die Stelle "while (!IstZahl(zaehler))":

    error C2664: 'IstZahl': Konvertierung des Parameters 1 von 'int' in 'System::String ^' nicht möglich
    Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
    Es ist keine Standardkonvertierung von der mittels Boxing geschachtelten Form des arithmetischen Typs in den Zieltyp vorhanden.
    

    (vollständige Fehlermeldung)

    Könnt ihr mir hier weiterhelfen? Mache ich grundsätzlich etwas falsch?

    LG, thowi



  • Das ist kein C++, sondern C++CLI, im Forum weiter oben zu finden.



  • Stimmt, hast du recht, da bin ich im falschen Unterforum gelandet - tut mir leid. Wäre ein Moderator bitte so nett, den Beitrag zu verschieben?

    ---

    Ich vermute, mein Problem liegt daran, dass ich meine Variable, die den eingelesenen Wert aufnimmt und dann an die Funktion IstZahl übergeben wird, vom typ INT erstellt wurde. Ich habe nun mal versucht, die Variable ebenfalls als string anzulegen:

    System::string^ zaehler;
    

    Dabei bekomme ich aber jetzt folgende Fehlermeldung:

    error C2039: 'string': Ist kein Element von 'System'
    error C2065: 'string': nichtdeklarierter Bezeichner
    error C2065: 'zaehler': nichtdeklarierter Bezeichner
    

    Spannend 😕



  • Hallo,

    beachte Groß- und Kleinschreibung.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • thowi schrieb:

    Könnt ihr mir hier weiterhelfen? Mache ich grundsätzlich etwas falsch?

    Ja, sogar zwei Sachen. Erstens versuchst du als Anfänger, C++/CLI zu machen. Großer Fehler, lern C++ oder C#, aber nicht den Bastard C++/CLI. Das ist nicht als eigenständige Programmiersprache gedacht, sondern als Bindeglied zwischen .NET und der in MS-Sprech "unmanaged"-Restwelt, in der auch C++ lebt.

    Etwas weniger grundsätzlich, aber doch schon irgendwie, ist der andere Fehler. Deine Funktion IstZahl prüft, ob ein übergebener String eine Zahl (bzw. Zahlendarstellung) enthält. Dh IstZahl("25") ist wahr, IstZahl("fünfundzwanzig") leider nicht. Du übergibst jetzt aber keinen String, sondern eine Variable vom Typ int . Das funktioniert zum einen schon deshalb nicht, weil es der falsche Typ ist (das steht dann so in der Fehlermeldung), macht aber zum anderen auch keinen Sinn, weil der Inhalt einer int -Variablen per Definition bereits eine Zahl ist. Die Konvertierung des eingegebenen Strings in eine Zahl passiert hier schon innerhalb von cin >> zahl , an der Stelle, wo du das prüfen willst, ist das Kind schon lange in den Brunnen gefallen. Wenn du nachträglich noch wissen willst, ob die Konvertierung geklappt hat, also eine Zahl eingegeben wurde, musst du den Status von cin prüfen: cin.fail() => true falls Fehler; oder kurz, dank der Magie von automatischen Typumwandlungen:

    if (cin >> zahl)
    {
       // alles OK, arbeite mit zahl
    }
    else
    {
       // hat nicht geklappt
    }
    

    (Wahrscheinlich ist etwas vereinfacht, du willst ja auch den Status des Streams zurücksetzen und andere Fehlerbedingungen auswerten, aber so ist die generelle Idee.)

    Achso, nochmal zurück zu Punkt 1: <iostream> und alles darin, wie cin, cout usw. gehört zu (unmanaged) C++, nicht zu C++/CLI. Man sollte das wirklich nicht mischen. Tu dir einen Gefallen, lösch das /clr Flag und lern erstmal richtiges C++.



  • Hi Bashar,

    danke für deine sehr ausführliche Antwort!
    Du hast schon Recht, ich versuche als Anfänger C++/CLI zu machen, weil ich die Methode Int32::TryParse verwenden muss/soll. Bei der Recherche zu der Methode bin ich dann zu CLI gekommen.
    Im Vorfeld hatte ich bereits eine gut funktionierende Lösung für die Eingabeprüfung z.B. mit cin.fail() und weiteren "hauseigenen" Mitteln erstellt.

    Nun war der Plan, eine zweite funktionierende Lösung mit der Methode Int32::TryParse zu erstellen. Aber dann komm ich am C++/CLI nicht vorbei, richtig? Kann ich also nicht so "mal eben schnell" implementieren, ohne mich intensiver mit C++/CLI auseinander zu setzen? Hab ich das so richtig verstanden?

    LG, thowi



  • thowi schrieb:

    Du hast schon Recht, ich versuche als Anfänger C++/CLI zu machen, weil ich die Methode Int32::TryParse verwenden muss/soll. Bei der Recherche zu der Methode bin ich dann zu CLI gekommen.

    Die Klasse System::Int32 gehört ja zu .NET, also bist du mit der Anforderung automatisch auf C++/CLI festgelegt.

    Nun war der Plan, eine zweite funktionierende Lösung mit der Methode Int32::TryParse zu erstellen.

    OK, dann halt C++/CLI, aber dann musst du dich auch darauf einlassen, d.h. nicht iostream, sondern .NET-Klassen. Und da TryParse einen String will, musst du einen String einlesen:

    String^ eingabe = Console::ReadLine();
    Int32 zahl;
    if (Int32::TryParse(eingabe, zahl))
    {
      // ok
    }
    


  • Okay danke, das macht Sinn. Für ein Beispiel wie deins unter

    using namespace System;
    String^ eingabe = Console::ReadLine();
    

    bekomme ich sofort die Fehlermeldung

    error C2065: 'string': nichtdeklarierter Bezeichner
    

    Auch für alle Variablen die ich mit

    int zaehler_k, nenner_k, ergebnis;
    

    oder auch mit Benutzung der Klasse

    int32 zaehler_k, nenner_k, ergebnis;
    

    Grundsätzlich scheint die Benutzung eines Programms unter CLI-Konsolenanwendung aber zu funktionieren, denn ich hab mal ein neues Projekt angelegt und dort dann das normale Hello-World-Default kompiliert. Merkwürdigerweise hat das dann funktioniert.



  • thowi schrieb:

    Okay danke, das macht Sinn. Für ein Beispiel wie deins unter

    using namespace System;
    String^ eingabe = Console::ReadLine();
    

    bekomme ich sofort die Fehlermeldung

    error C2065: 'string': nichtdeklarierter Bezeichner
    

    Es kommt auf Klein/Großschreibung an. Klassennamen fangen im .NET-Framework grundsätzlich mit Großbuchstaben an, also System::String, System::Int32 etc.



  • Ah super, danke dir, damit komme ich weiter.
    Danke für deine Hilfe!


Anmelden zum Antworten