Tic-Tac-Toe mit array's
-
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.
-
Mann, Mann, Mann.
DirkB schrieb:
int als Arrayindex findet der Compiler besser.
Heißt: Der Compiler hätte als Arrayindex lieber ein int statt eines char.
Da schauen wir mal in deine Funktion rein:
void eingabe(char feld[3][3],char zeile, int spalte) { ... feld[zeile][spalte]='X'; system("cls"); }
und sehen: hoppla, der Index für zeile ist ja vom Typ char.
Was kann man da machen? (achte auf das fett gedruckte)
DirkB schrieb:
void eingabe(char feld[3][3],[b]int [/b]zeile, int spalte)
denn:
DirkB schrieb:
Zeichen (Buchstaben) passen auch in ein int.
oder du castest zeile nach int. Dann ist der Compiler auch ruhig.
Deinen Hintern wisch ich jetzt aber nicht ab.
-
OKEY OKEY OKEY
Danke, Ich weiß ich bin etwas begriffsstützig
Danke für eure Hilfe
-
ok so weit so gut ... 0 warnings .... nur schreibt er mir bei int alles auf [0][0] -.-'