cin -> Absturz



  • hoi zäme

    Habe folgendes Problem und komme definitiv nicht mehr weiter:

    int i;
    std::cin >> i;

    ist ja normalerweise kein problem 🙂

    nun aber doch.. 😞

    nachdem ich ein externes Programm gestartet habe, beendet das Programm ohne Fehlermeldung einfach, sobald ich cin verwenden will (ausser wenn man cin>>string macht, aber nachher taugt der string nichts, sprich er nimmt die eingabe auch nicht korrekt auf).

    Folgende Varianten habe ich probiert:
    WinExec("ZeigeEichtemp.exe",SW_SHOW);
    ShellExecute(0, "open", "ZeigeEichtemp.exe", NULL, NULL, SW_SHOWNORMAL);
    system ("ZeigeEichtemp.exe");

    funktionieren zwar alle, aber unabhängig davon, ob ich diese neuen Fenster vorher wieder schliesse oder nicht, funktioniert der Instream anschliessend nicht mehr.
    Wie wenn irgend ein versteckter "Scope" ins Nirvana zeigen würde.
    std::cin.ignore(); und std::cin.clear(); bringen auch nichts.

    herzlichen Dank für die Aufklärung.

    Melchior



  • Kannst du den Code mal posten?



  • hier:

    void Ceva::sort_all_kurz()
    {   
        std::cin >> nr1; // funktioniert
        //WinExec("ZeigeEichtemp.exe",SW_SHOW);
        // ShellExecute(0, "open", "ZeigeEichtemp.exe", NULL, NULL, SW_SHOWNORMAL);
        //so funktionierts unten auch noch
    
         WinExec("ZeigeEichtemp.exe",SW_SHOW); // so oder
         ShellExecute(0, "open", "ZeigeEichtemp.exe", NULL, NULL, SW_SHOWNORMAL); //so
         std::cout << "Banane 1 fuer Eichung: Nummer:  \n"; 
         std::cin >> nr1; // macht das programm hier kommentarlos schluss
         // PS: Bei system(...) dasselbe
    }
    

    verdammter kack :p

    lg
    melch



  • Ist die Variable "nr1" global deklariert?



  • hoi freaky

    nei, nr1 ist element der Klasse Ceva.
    Egal, ob nr1 so definiert ist, ob ich es in der funktion selber initialisiere oder ob ich nr1 ausserhalb der klassenfunktion definiere und cin >> nach ausführung der klassenfunktion ausführe, immer das gleiche problem.

    lg
    melchior



  • Gut, nr1 ist also eine Variable aus der Klasse Ceva. Hast du es dann schonmal hiermit versucht ?

    std::cin >> Ceva.nr1;
    


  • jep 😞



  • Eventuell solltest du mal std::cin zurücksetzen. Manchmal schleichen sich da ein paar Flags ein die du vielleicht gar nicht mitbekommen hast.



  • Heyho. Ich gehe davon aus das dein Programm etwas größer ist, als den Code den du hier zeigst.

    Schonmal darüber gedacht, dass eventuell woanders noch Fehler sind, die sich erst hinterer auswirken?



  • @firefighter:

    std::cin zurücksetzen?
    mit ignore() und clear()? funzt nicht.

    @terranova

    daran habe ich auch gedacht. aber ich weiss nicht wo und weshalb.
    vor allem ist es ja so, dass cin unmittelbar bevor ich das externe programm aufrufe noch funktioniert und nachher nicht mehr.
    das externe programm ruft eine winmain() auf. ich schau einmal, ob das problem auch besteht, wenn ich eine normale konsolenanwendung extern laufen lasse.

    lg
    melchior



  • habe nun mit einem harmlosen programm (hallo welt) die folgenden möglichkeiten getestet:

    WinExec("harmlos.exe",SW_SHOW);
    ShellExecute(0, "open", "harmlos.exe", NULL, NULL, SW_SHOWNORMAL);

    bei beiden funktioniert vorher cin noch. bei winexec gings nachher auch noch, aber das programm wurde am falschen ort im quellcode ausgeführt(zwei zeilen zu weit unten)?!
    bei shellexecute zeigt sich das alte problem gleichermassen. das externe programm (hallo welt) wird am richtigen ort korrekt ausgeführt, anschliessend geht aber der instream nicht mehr.

    kann es irgendwie sein, dass der instream auf das eben ausgeführte (eigentlich auch beendete) programm zeigt und daher cin die eingabe irgendwo im externen programm speichern will?

    oder vielleicht anders formuliert: angenommen ich habe zwei programme in der shell am laufen. wo wird cin aufgenommen? intuitiv sollte es wohl dort sein, wo der scope liegt, aber vielleicht liegt hier irgendwo der hund begraben..

    lg
    melchior


Anmelden zum Antworten