Fehler suche
-
Hallo,
ich, leider immer noch blutiger Anfänger, habe aus einem C++ Lehrbuch ein kleines Programm und verstehe eine Sache nicht.
#include <iostream> using namespace std; const int X=9; const int Y=7; int main() { char Spielfeld[X][Y]; int x, y; char cx, cy; for (x=0; x<X; x++) { for (y=0; y<Y; y++) { Spielfeld[x][y] = '.'; } } bool SchleifenEnde=false; int xin, yin; do { cout << " 1 2 3 4 5 6 7 8 9" << endl; for (y=0; y<Y; y++) { cout << (char)('A'+y) << " "; for (x=0; x<X; x++) { cout << " " << Spielfeld[x][y] ; } cout << endl; } cin >> cx >> cy; xin = cx - '1'; yin = cy - 'A'; if (xin>=0 && xin<9 && yin>=0 && yin<7) { Spielfeld[xin][yin] = 'x'; } else { SchleifenEnde = true; } } while (!SchleifenEnde); }Wie funktioniert das mit dem 'A'? Wird das 'A' wie eine Zahl behandelt?
Vielen Dank im Vorraus
-
Lord Vincent schrieb:
Wie funktioniert das mit dem 'A'? Wird das 'A' wie eine Zahl behandelt?
Der Computer kennt nur Zahlen, A ist im Ascii-Code der Dezimalwert 65.
-
Lord Vincent schrieb:
Wie funktioniert das mit dem 'A'? Wird das 'A' wie eine Zahl behandelt?
Ja. Zeichen sind in C++ wie Zahlen, du kannst damit genau so rechnen wie mit allen anderen Zahlen. Der einzige größere Unterschied zwischen char und int (neben dem Wertebereich) ist das Verhalten bei der Ausgabe.
Der Zahlenwert eines Zeichens richtet sich dabei nach einer Zeichentabelle im Computer. Garantiert ist dir, dass die Zeichen '0' bis '9' auch genau in dieser Reihenfolge hintereinander im Zeichensatz stehen, so dass '1' - '0' = 1, '2' - '0' = 2, usw. gilt. (Wird hier in Zeile 36 benutzt)
Auf den meisten Rechnern darfst du davon ausgehen (ist aber streng genommen nicht garantiert!), dass ASCII oder eine Erweiterung davon als Zeichentabelle benutzt wird, da kannst du dann auch davon ausgehen, dass 'A' bis 'Z' geordnet in der Tabelle stehen, was hier auch benutzt wird. (Zeile 37 nutzt das aus)
-
das heißt wenn ich 'A' +1 rechne wir das dann B
-
Lord Vincent schrieb:
das heißt wenn ich 'A' +1 rechne wir das dann B
Außer auf sehr exotischen Rechnern: Ja.
-
Ich hab nun das Programm erweitert.
#include <iostream> using namespace std; const int X=9; const int Y=7; int main() { char Spielfeld[X][Y]; int x, y; char cx1, cy1; char cx2, cy2; for (x=0; x<X; x++) { for (y=0; y<Y; y++) { Spielfeld[x][y] = '.'; } } bool SchleifenEnde=false; int xin1, yin1; int xin2, yin2; do { cout << " 1 2 3 4 5 6 7 8 9" << endl; for (y=0; y<Y; y++) { cout << (char)('A'+y) << " "; for (x=0; x<X; x++) { cout << " " << Spielfeld[x][y] ; } cout << endl; } cin >> cx1 >> cy1; xin1 = cx1 - '1'; yin1 = cy1 - 'A'; cout << " - " << endl; cin >> cx2 >> cy2; xin2 = cx2 - '1'; yin2 = cy2 - 'A'; if(xin1==xin2 || yin1==yin2) { if(xin1==xin2) { int i; for(i=yin1;i==yin2;i++) { Spielfeld[xin1][i] = 'x'; } } else { int i; for(i=xin1;i==xin2;i++) { Spielfeld[i][yin1] = 'x'; }//Hier wird leider kein x in das array kopiert }// wo ist der Fehler } else { SchleifenEnde = true; } /*if (xin1>=0 && xin1<9 && yin1>=0 && yin1<7) { Spielfeld[xin1][yin1] = 'x'; } if (xin2>=0 && xin2<9 && yin2>=0 && yin2<7) { Spielfeld[xin2][yin2] = 'x'; } else { SchleifenEnde = true; }*/ } while (!SchleifenEnde); }
-
for(i=xin1;i==xin2;i++)Ich wette das macht nicht, was du denkst, was es macht. Nochmal for-Schleife angucken.
-
Sie soll vom Wert von xin1 bis zum Wert von xin2 laufen. Und dabei halt die Arrayspalte mit Xen versehen.
Wo liegt das Problem?
-
Lord Vincent schrieb:
Sie soll vom Wert von xin1 bis zum Wert von xin2 laufen. Und dabei halt die Arrayspalte mit Xen versehen.
Wo liegt das Problem?
Vielleicht darin, dass die Schleife das zwar soll aber garantiert nicht tut?
-
das war mir auch klar aber wo liegt der Fehler wie gesagt ich hab noch nicht soviel ahnung von c++
danke im vorraus
-
Hinweis: Der zweite Ausdruck im Schleifenkopf der for-Schleife ist die Bedingung, die erfüllt sein muss (solange Bedingung erfüllt). Da Du am Anfang i = xin1 setzt ist i == xin2 nur erfüllt wenn xin1 == xin2.
-
for(A; B; C) D;heißt auf Deutsch:
1. Mache A
2. Wenn B erfüllt ist, dann zu 3. ansonsten zu 6.
3. Mache D;
4. Mache C;
5. Zurück zu 2.
6. FertigUnd jetzt guck nochmal scharf hin, was bei dir wohl im Schritt 2 passiert.
-
erstmal danke für die schenlle Hilfe.
Es hat sich leider schon wieder ein PRoblem aufgetan.
Sobald ich die Spielfelgrenze X über 10 erhöhe, springt das Programm direkt ans Ende. Wer weiß warum und wie kann ich das Problem beheben?Vielen dank schonmal
-
Das ist eine ganz wunderbare Gelegenheit, den Umgang mit dem Debugger an einem (hoffentlich*) einfachem Beispiel zu üben. Mit dem Debugger musst du als Programmierer umgehen können. Also google mal ein bisschen, wie man in deiner Entwicklungsumgebung den Debugger nutzt. Oder falls du keine IDE benutzt, mach dich mal kundig, was bei deinem System der gängigste Debugger ist und wie man ihn grundlegend bedient. Dann gehst du mit dem Debugger dein Programm im Einzelschritt durch und guckst, an welcher Stelle das Programm etwas anderes macht, als du erwartest. Wenn es beispielsweise an einer if-Abfrage anders abzweigt als erwartet, dann guckst du dir mal die Variablen und Werte an, die in der Bedingung vorkommen. Ebenso wenn eine Schleife länger oder kürzer läuft als von dir erwartet. Falls ein Laufzeitfehler auftritt, sagt dir der Debugger, in welchem Ausdruck der Fehler stattfindet und du kannst dir den Programmzustand zum Fehlerzeitpunkt angucken.
*: Ich habe keine Ahnung, was hier das Problem ist, da deine Beschreibung zu unklar ist. Aber es klingt einfach.
-
hab leider kein brauchbares Tutorial für Microsoft Visual c++ 2010 gefunden.
und um meine Frage zu spezialisieren. Mein Problem ist, dass wenn ich die Grenze meines Spielfeld (zweidimensionales array) bei der X Variable auf einen Wert über zehn erhöhe springt das Programm sofort an das Ende des Programms.
-
Lord Vincent schrieb:
hab leider kein brauchbares Tutorial für Microsoft Visual c++ 2010 gefunden.
erster Treffern bei google: http://msdn.microsoft.com/en-us/library/k0k771bt(v=vs.100).aspx
Mein Problem ist, dass wenn ich die Grenze meines Spielfeld (zweidimensionales array) bei der X Variable auf einen Wert über zehn erhöhe springt das Programm sofort an das Ende des Programms.
Wie gesagt, bemüh deinen Debugger, um solche Probleme rauszufinden.