Array Ausgabe
-
Arg vergesst was ich da oben für einen Blödsinn geschrieben hab mit 'b'. Man sollte schon den ganzen Quelltext lesen
-
nwp2 schrieb:
Das ist komisches C++.
Ersetze Zeile 33 durch printf("%c", array[x][y]);
Ich verstehe auch nicht warum du array[5][20] schreibst (was unnötig ist) und dann von x<18 bis y<4 gehst.wie schreibt mann es sonnst? ich dachte so schreibt man 2Dimensionale arrays .
Das ist ansich nur C mit cin und cout mein tutor will es so
#include <conio.h> #include <iostream> using namespace std; int Spielfeld(); int Bewegung(); int main (void) { Spielfeld(); getch(); } int Spielfeld() { int x,y; unsigned char l=32; //Leerfeld// unsigned char b=254; //Begrenzung// unsigned char m=206; //Move// char array [5][19] = { {b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b}, }; for(x=0;x<=19;x++) { for (y=0;y<=4;y++) { printf("%c", array[x][y]); } cout <<endl; } }
Klappt leider auch nicht!
-
Juice191 schrieb:
Das ist ansich nur C mit cin und cout mein tutor will es so
C mit cin gibt es nur als Syntax Error
Wenn du dann noch die Arraygrenzen einhälst und in der for Schleife die Indizes richtig setzt, dann sollte das funzen.
-
Juice191 schrieb:
nwp2 schrieb:
Das ist komisches C++.
Ersetze Zeile 33 durch printf("%c", array[x][y]);
Ich verstehe auch nicht warum du array[5][20] schreibst (was unnötig ist) und dann von x<18 bis y<4 gehst.wie schreibt mann es sonnst? ich dachte so schreibt man 2Dimensionale arrays.
So zum Beispiel:
char *array[] = { "###################", "# #", "# #", "# #", "###################" };
Für char array[][] ist der gcc leider zu dumm, außerdem hat er den Bug, dass geschweifte Klammern bei der Initialisierung nicht akzeptiert werden.
Wahrscheinlich werden mich dafür alle hauen, aber als Faustregel kannst du dir merken, dass Zahlen in eckigen Klammern immer schlecht sind. Allermindestens die ersten Arrayklammern sollten leer sein.
-
Hallo, das versteh ich nicht, wieso wird jetzt vor dem Array ein * wie bei einem Pointer geschrieben warum darf man denn die zahlen weglassen?wofür benötigt man sie denn sonnst?
-
Die Zahl lässt man weg weil der Compiler selber zählen kann.
Zum Beispiel int array[] = {1, 2, 3}, da weiß der Compiler dass es 3 ints sind und schreibt die 3 selbst da rein. Das hat den Vorteil, dass du dich nicht drum kümmern musst, dich nicht verzählen kannst und wenn du später die Zahlen änderst wird die Anzahl automatisch angepasst.Das klappt natürlich nur für eindimensionale Arrays, bei int array[][] = {1,2,3,4} weiß er nicht ob es ein 1*4 oder 2*2 oder 41-Array ist. In dem Fall gibt man ihm eine Dimension vor: int array[][2] = {1,2,3,4}. Jetzt weiß er dass es ein 22-Array sein muss.
Der * im Beispiel oben bedeutet tatsächlich Pointer, es ist ein Array von char Pointern. Die Strings die dort stehen sind dann die char Pointer mit denen das Array gefüllt wird, und die Anzahl der Strings kann der Compiler selbst zählen.
Die korrekte Schreibweise für deinen Fall wäre meiner Meinung nach so hier, aber es funktioniert nicht:
char array[][] = { {b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b} };
Der gcc versteht es nicht weil er die geschweiften Klammern nicht für voll nimmt.
Du kannst aber eine Dimension vorgeben und die zweite automatisch füllen lassen:const char b = '#'; const char l = ' '; char array[][19] = { {b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}, {b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b} };
Hier müssen auch b und l konstant sein, sonst kann der Compiler das Array nicht zur Compilezeit erzeuge, weil er noch nicht weiß was b und l sein wird.
Irgenwie mag mich der gcc nicht mehr, wenn man ihn als C++-Compiler benutzt funktioniert das oben, wenn man ihn als C-Compiler benutzt kommt "error: initializer element is not constant", obwohl dort eindeutig const steht.
Mit #define b '#' und #define l ' ' klappt es dann, aber das ist auch hässlich.
Vielleicht kennt ja jemand noch eine bessere Schreibweise. Jedenfalls, Elemente zählen muss nun wirklich nicht sein.
-
naja also besser???
#define b '\0' #define l 'b' char row_0[] = {b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b}; char row_1[] = {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}; char row_2[] = {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}; char row_3[] = {b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b}; char row_4[] = {b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b}; char *cols[] = { row_0 ,row_1 ,row_2 ,row_3 ,row_4 };
oder eben so
#define rows 5 #define cols 19 char arr[] = { b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b ,b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b ,b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b ,b,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,b ,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b };
auf das array zugreifen kann man dann mit arr[row*cols+col]
-
noobLolo schrieb:
auf das array zugreifen kann man dann mit arr[row*cols+col]
dann sollte aber cols 18 sein?
-
Hallo,
nwp2 schrieb:
Der gcc versteht es nicht weil er die geschweiften Klammern nicht für voll nimmt.
Das ist generell so, der Standard schreibt vor, dass immer alle Größen, bis auf die innerste, angegeben werden müssen. Da kann man dem Compiler also auch nicht mit den Klammern helfen, denn sonst würde er nicht standardkonform sein.
nwp2 schrieb:
Irgenwie mag mich der gcc nicht mehr, wenn man ihn als C++-Compiler benutzt funktioniert das oben, wenn man ihn als C-Compiler benutzt kommt "error: initializer element is not constant", obwohl dort eindeutig const steht.
Auch hier klares Standardverhalten: es gibt einen Unterschied, wie C und C++ mit const qualifizierte Typen behandeln, siehe:
http://c-faq.com/ansi/constasconst.html
idiot... schrieb:
dann sollte aber cols 18 sein?
So ist es, wenn ich mich nicht auch verzählt habe.
MfG,
Probe-Nutzer
-
@Threadersteller:
Tausche doch einfach mal die innere gegen die äußere Schleife - oder wenn dir das lieber ist - x gegen y (im ersten Beitrag des Threads)
Also statt dem:
for(x=0;x<=18;x++) { for (y=0;y<=4;y++) { cout<<char(array[x][y]); } } }
for(int x=0;x<5;x++) { for(int y=0;y<20;y++) { cout<<array[x][y]<<" "; } } }
MfG