DO-WHILE-Fehler



  • Hallo Leute,

    do
        {
                                    cout << "Geben Sie ihr Schussziel an: " << endl;
                                    cin >> TargetLetter[i] >> TargetNumber[i];
                                    if((TargetLetter[i] == ComputerLetters[i]) && (TargetNumber[i] == ComputerNumbers[i]))
                                    {                    cout << "Treffer!!";
                                                         ComputerLetters[i] = NULL;
                                                         }
                                    }while((ComputerLetters != NULL) || (PlayerLetters != NULL));
    

    Ist nur der Beginn der While-Schleife..aber selbst hier treten bereits Fehler auf.. Indem Moment wo die If-Anweisung True ergibt spamt er mir die Console mit Geben sie ein Schussziel an voll.. ist das cout << "Treffer!!"; nicht in der If-Anweisung macht er dass nicht.. er beendet allerdings auch nicht die While-Schleife wenn ich alle ComputerLetters auf NULL gesetzt habe... ich bin mir aber auch nicht sicher ob ich dass so überhaupt machen kann.. Bitte um rasche Antwort.. Danke !



  • Hier das ganze Beispiel..falls gefragt:

    #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    
    using namespace std;
    
        //Random-Zahl erzeugen
        int getRandom(int SpielFeldGroesse)
        {
        int i = rand()%SpielFeldGroesse; //Erzeugt eine Random-Zahl zwischen 0 und 19
        return i;
        }
    
        char getAlphabet(int i)
        {
             char Alphabet[]="ABCDEFGHIJKLMN";
             return Alphabet[i];
         }
    
    int main(int argc, char *argv[])
    {
        /*time_t now = time(0); //Zeit in Sekunden seit 1 Januar 1970
        char *dt = ctime(&now); //Konvertierung der Zeit in String mit Monat Tag etc.
        cout << dt << endl;*/
        srand(time(0));//Damit für den Random-Algorithmus immer ein neuer Zahlenwert zur Verfügung steht
        int SpielFeldGroesse=13;
        int AmountOfShips=3;
        int AmountOfShots=50;
        int ComputerNumbers[3];
        char ComputerLetters[3];
        int PlayerNumbers[3];
        char PlayerLetters[3];
        int TargetNumber[AmountOfShots];
        char TargetLetter[AmountOfShots];
    
        int i;
        //Random Computer-Schiffe festlegen
        for(i=0;i<AmountOfShips;i++)
        {
                         ComputerNumbers[i]=getRandom(SpielFeldGroesse);
                         ComputerLetters[i]=getAlphabet(getRandom(SpielFeldGroesse));
                         }
        cout << ComputerNumbers[0] << endl << ComputerNumbers[1] << endl << ComputerNumbers[2] << endl; //Check-Ausgabe
        cout << ComputerLetters[0] << endl << ComputerLetters[1] << endl << ComputerLetters[2] << endl; //Check-Ausgabe
    
        //Spieler Erst-Eingabe
        for(i=0;i<AmountOfShips;i++)
        {
                                    cout << "Geben Sie die Position ihres " << i+1 << "ten Schiffes ein [A-N][0-13]: " << endl;
                                    cin >> PlayerLetters[i] >> PlayerNumbers[i];
                                    }
        cout << "Ihre Schiffspositionen lauten: " << endl;
        //Spieler-Ausgabe
        for(i=0;i<AmountOfShips;i++)
        {
                                    cout << PlayerLetters[i] << PlayerNumbers[i] << endl;
                                    }
        do
        {
                                    cout << "Geben Sie ihr Schussziel an: " << endl;
                                    cin >> TargetLetter[i] >> TargetNumber[i];
                                    if((TargetLetter[i] == ComputerLetters[i]) && (TargetNumber[i] == ComputerNumbers[i]))
                                    {                    cout << "Treffer!!"<<endl;
                                                         ComputerLetters[i] = NULL;
                                                         }
                                    }while((ComputerLetters != NULL) || (PlayerLetters != NULL));
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Hast vielleicht was falsches eingegeben, so dass die Eingabe das Fehlerbit setzt und daher nie mehr neu fragt?

    Mach mal ein

    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');*
    

    vor die if Abfrage.

    *: Bin mir hier nicht ganz sicher ausem Kopf, ob das so richtig ist.



  • Wie sollen denn ComputerLetters und PlayerLetters jemals NULL werden?
    1. veränderst du sie nicht in der Schleife und
    2. wäre das auch gar nicht möglich, da es Arrays sind.

    Was möchtest du da wirklich prüfen?

    Dein Einrückungsstil ist grauenhaft.
    Man nimmt erstmal an, das die } aus Zeile 69 zu de { aus Zeile 66 gehört.

    Die } bei do while gehört in die selbe Spalte wie das d vom do oder in die selbe Spalte wie die {. (Oder beides)



  • Hallo Skym0sh,

    Ja jetzt spamt er es nicht mehr voll. Allerdings funktioniert der break immernoch nicht. Also die Bedingung in der while Schleife..und in die IF-Schleife hüpft er auch nicht. LG



  • DirkB schrieb:

    Wie sollen denn ComputerLetters und PlayerLetters jemals NULL werden?
    1. veränderst du sie nicht in der Schleife und
    2. wäre das auch gar nicht möglich, da es Arrays sind.

    Was möchtest du da wirklich prüfen?

    Dein Einrückungsstil ist grauenhaft.
    Man nimmt erstmal an, das die } aus Zeile 69 zu de { aus Zeile 66 gehört.

    Die } bei do while gehört in die selbe Spalte wie das d vom do oder in die selbe Spalte wie die {. (Oder beides)

    Doch tue ich..siehe IF-Schleife in der While-Schleife (Falls das so funktioniert)... Die PlayerLetters sind noch nicht in die While-Schleife eingebaut..ist aber auch unnötig für dass hier, da Sie sowieso Oder-Verknüpft sind.. Nicht Man nimmt erstmal an, sondern Du.. das ist der Einrückungsstil von devcpp, beschwer dich dort bevor du mich kritisierst.. Es ist doch wohl klar dass sie Klammer vor while nur zur Klammer nach Do gehören kann... geht ja gar nicht anders....



  • MikeTheT schrieb:

    Doch tue ich..siehe IF-Schleife in der While-Schleife (Falls das so funktioniert)... Die PlayerLetters sind noch nicht in die While-Schleife eingebaut..ist aber auch unnötig für dass hier, da Sie sowieso Oder-Verknüpft sind..

    Nein, du veränderst Elemente in dem Array.
    Weisst was ComputerLetters ohne Indizes überhaupt bedeutet?

    MikeTheT schrieb:

    Nicht Man nimmt erstmal an, sondern Du.. das ist der Einrückungsstil von devcpp, beschwer dich dort bevor du mich kritisierst.. Es ist doch wohl klar dass sie Klammer vor while nur zur Klammer nach Do gehören kann... geht ja gar nicht anders....

    Er bleibt grauenhaft. Der Einrückungsstil soll die visuelle Erkennung der Blöcke unterstützen. Wenn man erst lesen muss, wo das while zum do versteckt ist, kann man drauf verzichten.
    Aber dann wird es auch keiner mehr lesen.

    http://de.wikipedia.org/wiki/Einr%C3%BCckungsstil
    http://www.if-schleife.de/



  • MikeTheT schrieb:

    DirkB schrieb:

    Wie sollen denn ComputerLetters und PlayerLetters jemals NULL werden?
    1. veränderst du sie nicht in der Schleife und
    2. wäre das auch gar nicht möglich, da es Arrays sind.

    Was möchtest du da wirklich prüfen?

    Dein Einrückungsstil ist grauenhaft.
    Man nimmt erstmal an, das die } aus Zeile 69 zu de { aus Zeile 66 gehört.

    Die } bei do while gehört in die selbe Spalte wie das d vom do oder in die selbe Spalte wie die {. (Oder beides)

    Doch tue ich..siehe IF-Schleife in der While-Schleife (Falls das so funktioniert)... Die PlayerLetters sind noch nicht in die While-Schleife eingebaut..ist aber auch unnötig für dass hier, da Sie sowieso Oder-Verknüpft sind.. Nicht Man nimmt erstmal an, sondern Du.. das ist der Einrückungsstil von devcpp, beschwer dich dort bevor du mich kritisierst.. Es ist doch wohl klar dass sie Klammer vor while nur zur Klammer nach Do gehören kann... geht ja gar nicht anders....

    Komm mal wieder runter. DirkB hat recht. Und egal ob der Intendationstyle von dir, von DevC++ oder vom kaiser von China gemacht ist.

    Objektiv gesehen ist der totale scheisse.
    (Auch ein Grund warum ich deinen Code aus dem Eingangspsot nichtmals durchgelesen hab.)

    Jetzt, wo du den ganzen Code gepostet hast, der ganze Einrückungsstil ist schlecht. Darüber hinaus ist DevCpp mehr als veraltet. Nimm entweder CodeBlocks oder Netbeans oder Eclipse oder Visual Studio(wenn Windows).



  • Skym0sh0 schrieb:

    Komm mal wieder runter. DirkB hat recht. Und egal ob der Intendationstyle von dir, von DevC++ oder vom kaiser von China gemacht ist.

    Objektiv gesehen ist der totale scheisse.
    (Auch ein Grund warum ich deinen Code aus dem Eingangspsot nichtmals durchgelesen hab.)

    Jetzt, wo du den ganzen Code gepostet hast, der ganze Einrückungsstil ist schlecht. Darüber hinaus ist DevCpp mehr als veraltet. Nimm entweder CodeBlocks oder Netbeans oder Eclipse oder Visual Studio(wenn Windows).

    Nein tu ich nicht! Der Ton macht die Musik, und es kommt sehr wohl darauf an wie man wem etwas sagt! Alles beruht auf Resonanz.. wie man in den Wald hineinruft so kommt es auch zurück. Ihr könnt ihr gerne sagen was ich besser machen soll, ihr kennt euch sicher besser aus als ich ! Aber wie, ist mir sehr wichtig... LG und bitte um weitere Hilfestellungen



  • MikeTheT schrieb:

    Skym0sh0 schrieb:

    Komm mal wieder runter. DirkB hat recht. Und egal ob der Intendationstyle von dir, von DevC++ oder vom kaiser von China gemacht ist.

    Objektiv gesehen ist der totale scheisse.
    (Auch ein Grund warum ich deinen Code aus dem Eingangspsot nichtmals durchgelesen hab.)

    Jetzt, wo du den ganzen Code gepostet hast, der ganze Einrückungsstil ist schlecht. Darüber hinaus ist DevCpp mehr als veraltet. Nimm entweder CodeBlocks oder Netbeans oder Eclipse oder Visual Studio(wenn Windows).

    Nein tu ich nicht! Der Ton macht die Musik, und es kommt sehr wohl darauf an wie man wem etwas sagt! Alles beruht auf Resonanz.. wie man in den Wald hineinruft so kommt es auch zurück. Ihr könnt ihr gerne sagen was ich besser machen soll, ihr kennt euch sicher besser aus als ich ! Aber wie, ist mir sehr wichtig...
    und was soll dein Ton? Du verlangst von mir runterzukommen aber selber nochmal drüberfahren, nein danke.. und wenn dass sowieso nur mit ein Grund war, hätte es ja auch nichts gebracht den schön zu formatieren... LG und bitte um weitere Hilfestellungen



  • Skym0sh0 schrieb:

    Komm mal wieder runter. DirkB hat recht. Und egal ob der Intendationstyle von dir, von DevC++ oder vom kaiser von China gemacht ist.

    Objektiv gesehen ist der totale scheisse.
    (Auch ein Grund warum ich deinen Code aus dem Eingangspsot nichtmals durchgelesen hab.)

    Jetzt, wo du den ganzen Code gepostet hast, der ganze Einrückungsstil ist schlecht. Darüber hinaus ist DevCpp mehr als veraltet. Nimm entweder CodeBlocks oder Netbeans oder Eclipse oder Visual Studio(wenn Windows).

    Nein tu ich nicht! Der Ton macht die Musik, und es kommt sehr wohl darauf an wie man wem etwas sagt! Alles beruht auf Resonanz.. wie man in den Wald hineinruft so kommt es auch zurück. Ihr könnt ihr gerne sagen was ich besser machen soll, ihr kennt euch sicher besser aus als ich ! Aber wie, ist mir sehr wichtig...
    und was soll dein Ton? Du verlangst von mir runterzukommen aber selber nochmal drüberfahren, nein danke.. und wenn dass sowieso nur mit ein Grund war, hätte es ja auch nichts gebracht den schön zu formatieren... LG und bitte um weitere Hilfestellungen



  • Sorry für die Doppelposts..hab mich im Affekt verklickt...



  • MikeTheT schrieb:

    Skym0sh0 schrieb:

    Komm mal wieder runter. DirkB hat recht. Und egal ob der Intendationstyle von dir, von DevC++ oder vom kaiser von China gemacht ist.

    Objektiv gesehen ist der totale scheisse.
    (Auch ein Grund warum ich deinen Code aus dem Eingangspsot nichtmals durchgelesen hab.)

    Jetzt, wo du den ganzen Code gepostet hast, der ganze Einrückungsstil ist schlecht. Darüber hinaus ist DevCpp mehr als veraltet. Nimm entweder CodeBlocks oder Netbeans oder Eclipse oder Visual Studio(wenn Windows).

    Nein tu ich nicht! Der Ton macht die Musik, und es kommt sehr wohl darauf an wie man wem etwas sagt! Alles beruht auf Resonanz.. wie man in den Wald hineinruft so kommt es auch zurück. Ihr könnt ihr gerne sagen was ich besser machen soll, ihr kennt euch sicher besser aus als ich ! Aber wie, ist mir sehr wichtig... LG und bitte um weitere Hilfestellungen

    Der Ton von DirkB war noch ganz in Ordnung und sachlich, sowas musste hier akzeptieren.



  • Visual Studio würde so einrücken.
    (Tasten Strg+A, Alt+F8, bzw Menu "Bearbeiten/Alles markieren", "Bearbeiten/Erweitert/Auswahl formatieren")
    Schau, wie eisern immer die schließende geschweifte Klammer genau unter der passenden öffnenden ist. Mußt zugeben, daß das beim Lesen hilfreich ist.

    #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    
    using namespace std;
    
    //Random-Zahl erzeugen
    int getRandom(int SpielFeldGroesse)
    {
    	int i = rand()%SpielFeldGroesse; //Erzeugt eine Random-Zahl zwischen 0 und 19
    	return i;
    }
    
    char getAlphabet(int i)
    {
    	char Alphabet[]="ABCDEFGHIJKLMN";
    	return Alphabet[i];
    }
    
    int main(int argc, char *argv[])
    {
    	/*time_t now = time(0); //Zeit in Sekunden seit 1 Januar 1970
    	char *dt = ctime(&now); //Konvertierung der Zeit in String mit Monat Tag etc.
    	cout << dt << endl;*/
    	srand(time(0));//Damit für den Random-Algorithmus immer ein neuer Zahlenwert zur Verfügung steht
    	int SpielFeldGroesse=13;
    	int AmountOfShips=3;
    	int AmountOfShots=50;
    	int ComputerNumbers[3];
    	char ComputerLetters[3];
    	int PlayerNumbers[3];
    	char PlayerLetters[3];
    	int TargetNumber[AmountOfShots];
    	char TargetLetter[AmountOfShots];
    
    	int i;
    	//Random Computer-Schiffe festlegen
    	for(i=0;i<AmountOfShips;i++)
    	{
    		ComputerNumbers[i]=getRandom(SpielFeldGroesse);
    		ComputerLetters[i]=getAlphabet(getRandom(SpielFeldGroesse));
    	}
    	cout << ComputerNumbers[0] << endl << ComputerNumbers[1] << endl << ComputerNumbers[2] << endl; //Check-Ausgabe
    	cout << ComputerLetters[0] << endl << ComputerLetters[1] << endl << ComputerLetters[2] << endl; //Check-Ausgabe
    
    	//Spieler Erst-Eingabe
    	for(i=0;i<AmountOfShips;i++)
    	{
    		cout << "Geben Sie die Position ihres " << i+1 << "ten Schiffes ein [A-N][0-13]: " << endl;
    		cin >> PlayerLetters[i] >> PlayerNumbers[i];
    	}
    	cout << "Ihre Schiffspositionen lauten: " << endl;
    	//Spieler-Ausgabe
    	for(i=0;i<AmountOfShips;i++)
    	{
    		cout << PlayerLetters[i] << PlayerNumbers[i] << endl;
    	}
    	do
    	{
    		cout << "Geben Sie ihr Schussziel an: " << endl;
    		cin >> TargetLetter[i] >> TargetNumber[i];
    		if((TargetLetter[i] == ComputerLetters[i]) && (TargetNumber[i] == ComputerNumbers[i]))
    		{                    
    			cout << "Treffer!!"<<endl;
    			ComputerLetters[i] = NULL;
    		}
    	}while((ComputerLetters != NULL) || (PlayerLetters != NULL));
    
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    

    Und die Einrückung, die Du hattest, war schon ein wenig komisch. Unter Profis wäre die sogar unhöflich gewesen.

    Ab besten immer mal wieder und anfangs immer vor dem Posten kurz von der IDE richten lassen. Bei Code::Blocks der Menupunkt "Format using AStyle".



  • Gewöhn dich an einen solchen Ton in Programmiererforen. Da gehts rabiater zu als bei Mama aufem Schoß 😉

    Wie du deinen Code einrückst oder nicht, das hat keinen semantischen Unterschied. Dem Compiler ist Schönheit und Übersichtlichkeit egal, dafür ists ein Programm.

    Aber ein Mensch hat's weit schwerer. Fremde, die deinen Code noch nicht gesehen haben, finden langsamer und schlechter hinein. Oder werden sogar ganz abgeschreckt und schauen erst gar nicht rein.

    Und irgendwann kommst auch du an den Punkt, wo du dich mal eben verliest und vertust, und dann setzt du eine Klammer falsch. Und das wird nicht immer einen Compilerfehler geben. Und dann wirst du merken: "Oh schaise, wo ist mein Fehler? ich hab doch alles richtig gemacht."



  • Und die Einrückung, die Du hattest, war schon ein wenig komisch. Unter Profis wäre die sogar unhöflich gewesen.

    Ab besten immer mal wieder und anfangs immer vor dem Posten kurz von der IDE richten lassen. Bei Code::Blocks der Menupunkt "Format using AStyle".

    Werde ich beim nächsten Mal beachten, danke !!



  • Skym0sh0 schrieb:

    Gewöhn dich an einen solchen Ton in Programmiererforen. Da gehts rabiater zu als bei Mama aufem Schoß 😉

    Wie du deinen Code einrückst oder nicht, das hat keinen semantischen Unterschied. Dem Compiler ist Schönheit und Übersichtlichkeit egal, dafür ists ein Programm.

    Aber ein Mensch hat's weit schwerer. Fremde, die deinen Code noch nicht gesehen haben, finden langsamer und schlechter hinein. Oder werden sogar ganz abgeschreckt und schauen erst gar nicht rein.

    Und irgendwann kommst auch du an den Punkt, wo du dich mal eben verliest und vertust, und dann setzt du eine Klammer falsch. Und das wird nicht immer einen Compilerfehler geben. Und dann wirst du merken: "Oh schaise, wo ist mein Fehler? ich hab doch alles richtig gemacht."

    Da hast du Recht was den Code und das Einlesen betrifft! Mit der Mama muss ich dir vll widersprechen ! hehe 😉 LG



  • Ich hab mal einen hilfreichen Plan hochgeladen, damit man sieht, welche Klammern zu welchen gehören.
    http://www.youscreen.de/mrhofmez31.jpg



  • MikeTheT schrieb:

    Ihr könnt ihr gerne sagen was ich besser machen soll, ihr kennt euch sicher besser aus als ich ! Aber wie, ist mir sehr wichtig... LG und bitte um weitere Hilfestellungen

    Habe ich ja gemacht. Sogar mit Begründung.

    Dein eigentliches Problem ist aber ein anderes.
    Wie sieht es damit aus.



  • DirkB schrieb:

    Dein eigentliches Problem ist aber ein anderes.
    Wie sieht es damit aus.

    DirkB schrieb:

    Dein eigentliches Problem ist aber ein anderes.
    Wie sieht es damit aus.

    do
        {
                                    cout << "Geben Sie ihr Schussziel an: " << endl;
                                    cin >> TargetLetter[i] >> TargetNumber[i];
                                    cin.clear(); 
                                    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
                                                         if((TargetLetter[i] == ComputerLetters[i]) && (TargetNumber[i] == ComputerNumbers[i]))
                                                         {                    
                                                         cout << "Treffer!!"<<endl;
                                                         ComputerLetters[i] = NULL;
                                                         }
                                    cout << TargetLetter[i];
        }while((ComputerLetters != NULL) || (PlayerLetters != NULL));
    

    Hallo Dirk, schau bitte in die IF-Schleife..ich bilde mir ein, dass ich hier ComputerLetters[i] auf NULL setze..bin mir aber nicht sicher ob es so funktioniert... auch ob der Ausdruck in der while schleife so funktioniert/richtig ist... das problem und wie es sich zeigt hab ich ganz am anfang schon erklärt.. LG Michi ..so jetzt müsste es auch deutlich besser zu lesen sein LG



  • Schau dir doch mal die while-Bedingung ganz genau an.


Anmelden zum Antworten