Tic-Tac-Toe mit array's
-
cooky451 schrieb:
Und trotz Fehlens jeglicher Fehlerbeschreibung:
Sollten sich die Werte der Variablen die in der main() deklariert wurden irgendwann mal ändern?
-
1. Wenn du Hilfe willst, dann beschreibe die Fehler die du hast.
2. Dein Compiler hilft dir auch, aktiviere alle Warnoptionen. Hier mal eine Ausgabe für dein Programm:
test.c: In function ‘main’: test.c:32: warning: passing argument 1 of ‘eingabe’ from incompatible pointer type test.c:12: note: expected ‘char *’ but argument is of type ‘char (*)[3]’ test.c:33: warning: passing argument 1 of ‘zeichneFeld’ makes pointer from integer without a cast test.c:11: note: expected ‘char * (*)[3]’ but argument is of type ‘char’ test.c: In function ‘zeichneFeld’: test.c:56: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’ test.c:56: warning: format ‘%c’ expects type ‘int’, but argument 3 has type ‘char *’ test.c:56: warning: format ‘%c’ expects type ‘int’, but argument 4 has type ‘char *’ test.c:57: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’ test.c:57: warning: format ‘%c’ expects type ‘int’, but argument 3 has type ‘char *’ test.c:57: warning: format ‘%c’ expects type ‘int’, but argument 4 has type ‘char *’ test.c:58: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’ test.c:58: warning: format ‘%c’ expects type ‘int’, but argument 3 has type ‘char *’ test.c:58: warning: format ‘%c’ expects type ‘int’, but argument 4 has type ‘char *’ test.c: In function ‘eingabe’: test.c:77: warning: array subscript has type ‘char’ test.c:77: error: subscripted value is neither array nor pointer
Jede Warnung eines Compilers ist als Fehler anzusehen. Der Compiler bricht bloß nicht mit einem Fehler ab, weil er dich für einen C-Oberguru hält, der genau weiß, was er da tut. Das bist du aber nicht.
-
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <windows.h> #define Z 3 #define S 3 void programStart(); void zeichneFeld(char *feld[3][3], int n, int s); void eingabe(char *feld,char zeile, int spalte); int pruefeEingabe(char zeile, int spalte); int main() { char feld[3][3] = {{0}}; int n=0,s=0; int spalte=1; char zeile='A'; programStart(); printf(" 1 2 3 \n"); printf(" |---|---|---|\n"); printf(" A | | | |\n"); printf(" B | | | |\n"); printf(" C | | | |\n"); printf(" |---|---|---|\n"); printf("Noch keine Spielzuege vorhanden!\n"); eingabe(feld,zeile,spalte); zeichneFeld(feld[n][s],n,s); system("PAUSE"); return 0; } void programStart() { printf("Herzlich Willkomen bei Tic-Tac-Toe!\n\n" "Der Spieler X beginnt, Die Eingabe erfolgt im Format\n" "ZeileSpalte, z.B.: B2!\nWenn sie soweit sind kann das Spiel beginnen!\n\n"); system("PAUSE"); system("cls"); } void zeichneFeld(char *feld[3][3], int n, int s) { printf(" 1 2 3 \n"); printf(" |---|---|---|\n"); printf(" A |%s |%s |%s |\n",feld[n][s],feld[n][s],feld[n][s]); printf(" B |%s |%s |%s |\n",feld[n][s],feld[n][s],feld[n][s]); printf(" C |%s |%s |%s |\n",feld[n][s],feld[n][s],feld[n][s]); printf(" |---|---|---|\n"); } void eingabe(char *feld,char zeile, int spalte) { char enter[3], dummy; int ok; printf("Spieler X Ihre Eingabe -> "); gets(enter); ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy); printf("%c%d\n",zeile,spalte); if(zeile=='A') zeile=0; if(zeile=='B') zeile=1; if(zeile=='C') zeile=2; spalte=-1; feld[zeile][spalte]='X'; system("PAUSE"); } int pruefeEingabe(char zeile, int spalte) { if(zeile>='A'&&zeile<='C'&&spalte>=1&&spalte<=3) return 0; else return 1; }
ok .... in zeile 77 will ich das feld ja beschreiben -.-'
-
Und der Compiler lässt das nicht zu, weil feld ein char* ist. Daher ist dann feld[zeile] ein char und feld[zeile][spalte] macht keinen Sinn mehr, da man einen char nicht weiter dereferenzieren kann.
Das ist aber eigentlich ein Folgefehler, weil feld in diesem Zusammenhang eigentlich gar kein char* sein sollte, sondern wohl eher ein char (*)[3].
Ob diese Änderung alleine hilft, bezweifle ich jedoch, da die obige Compilerausgabe dir zeigt, dass dein Programm überall nur so vor Fehlern strotzt.
Und zum allerletzten Mal: Stell vernünftige Fragen! Beschreibe deine Fehler! Dies war das letzte Mal, dass du ohne eine vernünftige Fehlerbeschreibung eine Antwort bekommst. Einfach nur Quellcode mit der Angabe "geht nicht" ist keine Fehlerbeschreibung.
-
In Zeile 77 weiß der Compiler nichts von der Feldgröße 3x3
Bei
void zeichneFeld(char *feld[3][3], int n, int s)
ist ein * zuviel.
-
Nochmal zu zeichneFeld:
%s gibt einen String aus.
Das ist ein Zeichenfolge, die mit dem Zeichen'\0' abgeschlossen ist. feld[][] besteht aber nur aus einzelnen Zeichen.
Im ersten Post war das zumindest noch richtig.
-
ok
@SeppJ ja ja ... ist okey
@DirkB Danke
So ich verstehe das in Zeile 77 nicht was dieses Warning von mir will?#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <windows.h> #define Z 3 #define S 3 void programStart(); void zeichneFeld(char feld[3][3], int n, int s); void eingabe(char feld[3][3],char zeile, int spalte); int pruefeEingabe(char zeile, int spalte); int main() { char feld[3][3] = {{0}}; int n=0,s=0; int spalte=1; char zeile='A'; programStart(); printf(" 1 2 3 \n"); printf(" |---|---|---|\n"); printf(" A | | | |\n"); printf(" B | | | |\n"); printf(" C | | | |\n"); printf(" |---|---|---|\n"); printf("Noch keine Spielzuege vorhanden!\n"); eingabe(feld,zeile,spalte); zeichneFeld(feld,n,s); system("PAUSE"); return 0; } void programStart() { printf("Herzlich Willkomen bei Tic-Tac-Toe!\n\n" "Der Spieler X beginnt, Die Eingabe erfolgt im Format\n" "ZeileSpalte, z.B.: B2!\nWenn sie soweit sind kann das Spiel beginnen!\n\n"); system("PAUSE"); system("cls"); } void zeichneFeld(char feld[3][3], int n, int s) { printf(" 1 2 3 \n"); printf(" |---|---|---|\n"); printf(" A |%d |%d |%d |\n",feld[n][s],feld[n][s],feld[n][s]); printf(" B |%d |%d |%d |\n",feld[n][s],feld[n][s],feld[n][s]); printf(" C |%d |%d |%d |\n",feld[n][s],feld[n][s],feld[n][s]); printf(" |---|---|---|\n"); } void eingabe(char feld[3][3],char zeile, int spalte) { char enter[3], dummy; int ok; printf("Spieler X Ihre Eingabe -> "); gets(enter); ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy); printf("%c%d\n",zeile,spalte); if(zeile=='A') zeile=0; if(zeile=='B') zeile=1; if(zeile=='C') zeile=2; spalte=-1; feld[zeile][spalte]='X'; system("PAUSE"); } int pruefeEingabe(char zeile, int spalte) { if(zeile>='A'&&zeile<='C'&&spalte>=1&&spalte<=3) return 0; else return 1; }
EDIT: ist doch eigentlich eine korrekte zuweisung oder?
-
Du hast ja jetzt einiges geändert.
Wie lautet denn jetzt die Warnung?
-
So jz läufts .... hab aber immer noch 1 Warning
75: Array subscribed has type 'char'
Quellcode:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <windows.h> #define Z 3 #define S 3 void programStart(); void zeichneFeld(char feld[3][3], int n, int s); void eingabe(char feld[3][3],char zeile, int spalte); int pruefeEingabe(char zeile, int spalte); int main() { char feld[3][3] = {{0}}; int n=0,s=0; int spalte=1; char zeile='A'; programStart(); printf(" 1 2 3 \n"); printf(" |---|---|---|\n"); printf(" A | | | |\n"); printf(" B | | | |\n"); printf(" C | | | |\n"); printf(" |---|---|---|\n"); printf("Noch keine Spielzuege vorhanden!\n"); eingabe(feld,zeile,spalte); zeichneFeld(feld,n,s); eingabe(feld,zeile,spalte); zeichneFeld(feld,n,s); system("PAUSE"); return 0; } void programStart() { printf("Herzlich Willkomen bei Tic-Tac-Toe!\n\n" "Der Spieler X beginnt, Die Eingabe erfolgt im Format\n" "ZeileSpalte, z.B.: B2!\nWenn sie soweit sind kann das Spiel beginnen!\n\n"); system("PAUSE"); system("cls"); } void zeichneFeld(char feld[3][3], int n, int s) { printf(" 1 2 3 \n"); printf(" |---|---|---|\n"); printf(" A | %c | %c | %c |\n",feld[0][0],feld[0][1],feld[0][2]); printf(" B | %c | %c | %c |\n",feld[1][0],feld[1][1],feld[1][2]); printf(" C | %c | %c | %c |\n",feld[2][0],feld[2][1],feld[2][2]); printf(" |---|---|---|\n"); } void eingabe(char feld[3][3],char zeile, int spalte) { char enter[3], dummy; int ok; printf("Spieler X Ihre Eingabe -> "); gets(enter); ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy); if(zeile=='A') zeile=0; if(zeile=='B') zeile=1; if(zeile=='C') zeile=2; spalte-=1; feld[zeile][spalte]='X'; system("cls"); } int pruefeEingabe(char zeile, int spalte) { if(zeile>='A'&&zeile<='C'&&spalte>=1&&spalte<=3) return 0; else return 1; }
-
Der Compiler möchte dich darauf aufmerksam machen, dass du ohne die Zeilen 68-73 sterben würdest.
-
Gut ist logisch, aber wie bekomm ich den Warning weg?
-
Hello World_unreg schrieb:
Gut ist logisch, aber wie bekomm ich den Warning weg?
Ersetz den ganzen Block durch:
ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy); feld[zeile - 'A'][spalte - 1]='X';
Und außerdem: Wozu ist dummy gut? Wozu ist enter gut? Warum prüfst du ok nicht?
edit: Jaja, ganz genau genommen ist das nicht portabel, da 'B' und 'C' nicht auf 'A' folgen müssen. Dann kann man das Spiel eben nicht auf einem System mit EBCDIC-Zeichensatz spielen.
-
int als Arrayindex findet der Compiler besser.
void eingabe(char feld[3][3],[b]int [/b]zeile, int spalte)
Zeichen (Buchstaben) passen auch in ein int.
-
SeppJ schrieb:
Dann kann man das Spiel eben nicht auf einem System mit EBCDIC-Zeichensatz spielen.
Warum nicht? Zumindest A-I sind fortlaufend bei EBCDIC.
-
Das heißt?
-
-
Ok das wäre nicht gut
Aber wie kann ich diesen Warning beheben .... da er führ mich logisch erscheint -.-'
-
Habe ich um 15:45:26 geschrieben.
-
DirkB schrieb:
Habe ich um 15:45:26 geschrieben.
Ja wie grieg ich den jz weg?
-
Du hast jetzt schon zwei gute Antworten dazu bekommen. Einmal meine (die auch auf EBCDIC funktioniert, dessen Zeichentabelle ich nicht komplett auswendig kenne
) und die von DirkB. Bitte lies sie, sonst verlieren Helfer das Interesse.