programm stürzt ab...



  • also mein prog ist, da ich n noop bin ne art hangmanspiel, mit (noch) ein paar macken. auf jeden fall stürzt es (manchmal) (meiner meinung nach) ab wenn die zufallszahl einen best wwert animmt. welcher kann ich nicht sagen sonst hätt ich diesen scheiß nich an der ferse kleben.

    vielleicht weiß jemand weiter und/ oder hat tips zum code bezüglich seiner optimierung, falls jemand den code nicht ganz verstehen sollte kann er fragen posten.

    danke für (eventuelle antworten.

    #include <iostream>
    #include <cstdlib>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <time.h>
    #include <fstream>

    using namespace std;

    int zufallsbegrenzer;
    string shiffrierteswort;
    ////////////////////////////////////////////////////////////////////////////////
    int random (int bereich) {
    long sek;
    time(&sek);
    srand( (unsigned) sek);
    //srand (time (0));
    int zufall = ( rand() % bereich - 1 );
    //return zufall;
    }
    ////////////////////////////////////////////////////////////////////////////////
    string wordlist (int zZahl)
    {
    vector<string> contents;

    ifstream FileIn("wordlist.txt");
    if (FileIn) // Falls FileIn gültig ist.
    {
    // Solange kein Fehler auftritt und nicht eof
    for (string ReadString; getline(FileIn, ReadString); )
    contents.push_back(ReadString); // Aktuelle Zeile in den Vektor einfügen
    }
    zufallsbegrenzer = contents.size();
    return contents[zZahl];
    }
    ////////////////////////////////////////////////////////////////////////////////
    void ausgabewort ( int Laenge, short durchgangscounter ) {
    int x;
    shiffrierteswort = ("");

    cout<<"Sie haben "<< 2 * Laenge <<" Versuche!"
    <<"\nWort: ";

    //cout<<"Noch 16 Versuche!"
    //<<"\nWort: ";
    for ( x = 0; x < Laenge; x++ ) {
    shiffrierteswort += ("-");
    cout<<"-";
    }
    cout<<endl;
    }
    ////////////////////////////////////////////////////////////////////////////////
    void hangman ( int hangmannummer ) { switch ( hangmannummer ) {
    case 0:
    //usw... zu lang fürs forum, aber nur müll
    }
    }
    ////////////////////////////////////////////////////////////////////////////////

    int main(/*int argc, char *argv[]*/)
    {
    bool spiel = false;
    int x;
    int rand;
    short durchgangscounter = 0;

    wordlist (1); //um "zufallsbegrenzer" zu initialisieren, verbesserungsbedürftig
    string ratewort = wordlist( random ( zufallsbegrenzer ) );
    // programm stürzt ab, dachte erst liegt, daran dass zufallszahl länger als //arraylänge der datei ist stürzt aber auch ohne bezug auf datei ab, dh wenn ich //nur z-zahl generiere und z.b. ausgebe

    string eingabe;

    ausgabewort ( ratewort.length(), durchgangscounter );

    while ( eingabe != "exit" && eingabe.length() < 2 ) {

    hangman ( durchgangscounter );
    ++durchgangscounter;
    cin>>eingabe;

    for ( x = 0; x < ratewort.length(); x++ ) {


    shiffrierteswort.replace ( x, 1, eingabe );
    durchgangscounter--;
    }
    }

    system ( "cls" );
    cout<<"Noch "<< 2 * ratewort.length() - durchgangscounter <<" Versuche!"
    <<"\nWort: "<<shiffrierteswort<<endl;

    if ( ratewort == shiffrierteswort ) {
    cout<<"\n\ngewonnen\n";
    break;
    }

    if ( durchgangscounter == 2*ratewort.length() - 1 )
    break;
    }

    system("PAUSE");
    return 0;
    }



  • uh, so ist der Code absolut unlesbar. Bitte lesen sfds ansonsten wird sich sicher niemand die Mühe machen, den Code zu lesen.

    Hast du mal mit einem Debugger geguckt, wo das Problem sein könnte?



  • #include <iostream>
    #include <cstdlib>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <time.h>
    #include <fstream>
    
    using namespace std;
    
    int zufallsbegrenzer;
    string shiffrierteswort;
    ////////////////////////////////////////////////////////////////////////////////
    int random (int bereich) {
    long sek;
    time(&sek);
    srand( (unsigned) sek);
    //srand (time (0));
    int zufall = ( rand() % bereich - 1 );
    //return zufall;
    }
    ////////////////////////////////////////////////////////////////////////////////
    string wordlist (int zZahl)
    {
    vector<string> contents;
    
    ifstream FileIn("wordlist.txt");
    if (FileIn) // Falls FileIn gültig ist.
    {
    // Solange kein Fehler auftritt und nicht eof
    for (string ReadString; getline(FileIn, ReadString); )
    contents.push_back(ReadString); // Aktuelle Zeile in den Vektor einfügen
    }
    zufallsbegrenzer = contents.size();
    return contents[zZahl];
    }
    ////////////////////////////////////////////////////////////////////////////////
    void ausgabewort ( int Laenge, short durchgangscounter ) {
    int x;
    shiffrierteswort = ("");
    
    cout<<"Sie haben "<< 2 * Laenge <<" Versuche!"
    <<"\nWort: ";
    
    //cout<<"Noch 16 Versuche!"
    //<<"\nWort: ";
    for ( x = 0; x < Laenge; x++ ) {
    shiffrierteswort += ("-");
    cout<<"-";
    }
    cout<<endl;
    }
    ////////////////////////////////////////////////////////////////////////////////
    void hangman ( int hangmannummer ) { switch ( hangmannummer ) {
    case 0:
    //usw... zu lang fürs forum, aber nur müll
    }
    }
    ////////////////////////////////////////////////////////////////////////////////
    
    int main(/*int argc, char *argv[]*/)
    {
    bool spiel = false;
    int x;
    int rand;
    short durchgangscounter = 0;
    
    wordlist (1); //um "zufallsbegrenzer" zu initialisieren, verbesserungsbedürftig
    string ratewort = wordlist( random ( zufallsbegrenzer ) );
    // programm stürzt ab, dachte erst liegt, daran dass zufallszahl länger als //arraylänge der datei ist stürzt aber auch ohne bezug auf datei ab, dh wenn ich //nur z-zahl generiere und z.b. ausgebe
    
    string eingabe;
    
    ausgabewort ( ratewort.length(), durchgangscounter );
    
    while ( eingabe != "exit" && eingabe.length() < 2 ) {
    
    hangman ( durchgangscounter );
    ++durchgangscounter;
    cin>>eingabe;
    
    for ( x = 0; x < ratewort.length(); x++ ) {
    if ( eingabe[0] == ratewort[x] ) {
    shiffrierteswort.replace ( x, 1, eingabe );
    durchgangscounter--;
    }
    }
    
    system ( "cls" );
    cout<<"Noch "<< 2 * ratewort.length() - durchgangscounter <<" Versuche!"
    <<"\nWort: "<<shiffrierteswort<<endl;
    
    if ( ratewort == shiffrierteswort ) {
    cout<<"\n\ngewonnen\n";
    break;
    }
    
    if ( durchgangscounter == 2*ratewort.length() - 1 )
    break;
    }
    
    system("PAUSE");
    return 0;
    }
    

    besser?



  • formatierst du immer am rechten rand? einrücken 😉

    erste frage: existiert die datei "wordlist.txt" und hat sie einen inhalt, der passt? sonst stürzt dir das programm ab.



  • kfee schrieb:

    //...
    

    besser?

    leider nur bunter 😕
    kannste was gegen die nicht-einrückung unternehmen ?
    dann würds auch 'spaß' machen das zu lesen



  • jap in wordlist sind die ersten fehler
    wenn die datei nicht da ist wird böse
    ausserdem ist des

    return contents[zZahl];
    

    auch nicht ohne



  • wordlist.txt existiert natürlich, und wo ist:

    //...
    

    ???
    aber warum stüzt das prog ab, kanns vielleicht an devc++ liegen

    das

    return contents[zZahl]
    

    löst doch kein absturz aus keine ahnung kann ich nur ma ausprobieren, und so schlimm ist die form auch nicht! 😡



  • ach und das formatieren scheint verloren gegangen zu sein.

    #include <iostream>
    #include <cstdlib>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <time.h>
    #include <fstream>
    
    using namespace std;
    
    int zufallsbegrenzer;
    string shiffrierteswort;
    ////////////////////////////////////////////////////////////////////////////////
    int random (int bereich) {
        long sek;
        time(&sek);
        srand( (unsigned) sek);
        //srand (time (0));
        int zufall = ( rand() % bereich - 1 );
        //return zufall;
        }
    ////////////////////////////////////////////////////////////////////////////////
    string wordlist (int zZahl)
    {
        vector<string> contents;
    
        ifstream FileIn("wordlist.txt");
        if (FileIn) // Falls FileIn gültig ist.
        {
            // Solange kein Fehler auftritt und nicht eof
            for (string ReadString; getline(FileIn, ReadString); )
                contents.push_back(ReadString); // Aktuelle Zeile in den Vektor einfügen
        }
        zufallsbegrenzer = contents.size();
     return contents[zZahl];
    }
    ////////////////////////////////////////////////////////////////////////////////
    void ausgabewort ( int Laenge, short durchgangscounter ) {
        int x;
        shiffrierteswort = ("");
    
        cout<<"Sie haben "<< 2 * Laenge <<" Versuche!"
            <<"\nWort: ";
    
        //cout<<"Noch 16 Versuche!"
            //<<"\nWort: ";
        for ( x = 0; x < Laenge; x++ ) {
            shiffrierteswort += ("-");
            cout<<"-";
            }
        cout<<endl;
        }
    ////////////////////////////////////////////////////////////////////////////////
    void hangman ( int hangmannummer ) { switch ( hangmannummer ) {}       
        }
    ////////////////////////////////////////////////////////////////////////////////
    
    int main(/*int argc, char *argv[]*/)
    {
        bool spiel = false;  
        int x;
        int rand;
        short durchgangscounter = 0;
    
        wordlist (1); //um "zufallsbegrenzer" zu initialisieren, verbesserungsbedürftig 
        string ratewort = wordlist( random ( zufallsbegrenzer ) );
        string eingabe;
    
        ausgabewort ( ratewort.length(), durchgangscounter );
    
        while ( eingabe != "exit" && eingabe.length() < 2 ) {
    
        hangman ( durchgangscounter );
        ++durchgangscounter;  
        cin>>eingabe;
    
                for ( x = 0; x < ratewort.length(); x++ ) {
                                if ( eingabe[0] == ratewort[x] ) {
                                shiffrierteswort.replace ( x, 1, eingabe );
                                durchgangscounter--;
                                }
                }
    
        system ( "cls" );
        cout<<"Noch "<< 2 * ratewort.length() - durchgangscounter <<" Versuche!"
            <<"\nWort: "<<shiffrierteswort<<endl;
    
        if ( ratewort == shiffrierteswort ) {
        cout<<"\n\ngewonnen\n";
        break;
        }    
    
        if ( durchgangscounter == 2*ratewort.length() - 1 )
        break;
        }       
    
      system("PAUSE");	
      return 0;
    }
    

    so besser ist mir nicht gleich aufgefallen



  • Eines deiner Probleme liegt hier:

    int zufall = ( rand() % bereich - 1 );
    

    rand() % bereich liefert Werte zwischen 0 und bereich - 1, dh zufall kann Werte zwischen -1 und bereich - 2 annehmen. Wobei -1 zu einer Zugriffsverletzung in wordlist() führt. Nach oben könnten auch noch Probleme auftreten, so genau hab ich deinen Code allerdings nicht studiert.



  • mmh, stimmt das mistding stürzt auch wenn ich die "-1" weglasse, wie könnts denn besser aussehen mit "+1" hauts jedenfalls nicht hin, könnt ja ma den source kompillieren.



  • Also nachdem ich angesprochene Stelle korrigiert hab

    int zufall = rand() % bereich;
    

    konnte ich das Programm nicht mehr zum Absturz bewegen. Was aber nicht heissen soll, dass es keine Fehler mehr gibt. Ganz im Gegenteil, es bedarf noch einiger Überarbeitung.
    Zuerst solltest du mal versuchen alle Warnungen zu beseitigen, denn Warnungen sind eigentlich (bis auf wenige Ausnahmen) compilierbare Fehler (oder hast du etwa alle Warnungen abgestellt 😮 ).
    Sollte dein Programm trotzdem noch abstürzen, wirf mal den Debugger an und sag uns in welcher Zeile das Programm abstürzt.



  • j einige fehler hats noch wirklich, aber schonmal danke.
    rein interessenhalber habt ihr beim wörtererraten mal "b" eingetippt warum zählt der counter gerade bei "b" hoch anstatt sein ursprünglichhen wert zu behalten.
    denn counter-- + counter++ = x und nicht x+1. und gerade bei b? 😮
    danke aber wegen dem absturzproblem



  • ähm, stürzt immer noch ab, wird wo am compiler liegen welchen benutzt du?



  • kfee schrieb:

    ähm, stürzt immer noch ab, wird wo am compiler liegen welchen benutzt du?

    Ja, das ist ne einfache Lösung... Und in 99,99% der Fälle falsch. Die meisten Compiler generieren recht zuverlässigen Code.
    Such lieber nochmal ordentlich, benutz den Debugger etc.

    MfG Jester



  • es stürzt aber immer ab wenn ich ne zufallszahl generieren will, und da gibt es nicht besonders viele möglichkeiten


Log in to reply