Seite 1 von 1

2 dimensionales array

Verfasst: Mo Mär 09, 2009 2:08 pm
von 8bit
Hi Leute,
ich bin blutiger Anfänger (heißt im Klartext: vor 2 Tagen angefangen), also verzeiht mir, wenn das alles bei mir n bissel länger dauert...
Also, mein problem:
tutorials.at hat geschrieben:Da dreidimensionale Arrays schwer zu veranschaulichen (wäre ein dreidimensionaler Quader) sind, gehen wir einen Schritt zurück zu zwei Dimensionen. Im Folgenden wird das Array daten[3][2] deklariert, das somit 6 (= 2 * 3) Elemente enthält. Das Array wird bei der Deklaration vollständig initialisiert:

int daten [3][2] = { { 1, 2 } , { 3, 4 } , { 5, 6 } };

Wie bei einem eindimensionalen Array, ist die Initialisierung von geschwungenen Klammern umgeben (blau gekennzeichnet). Abschließend folgt ein Semikolon. An dem ersten Index kann man erkennen, dass in der ersten Dimension 3 Ebenen existieren: daten[0][..], daten[1][..] und daten[2][..]. Jede dieser Dimensionen muss wiederum in geschwungenen Klammern stehen (rot gekennzeichnet). Beachten Sie, dass diese durch Beistriche getrennt werden müssen! Schlussendlich fügen Sie in jede der 3 Dimensionen 2 Werte ein (grün gekennzeichnet). Da die zweite Dimension aus zwei Elementen besteht, müssen zwei Werte dort stehen. Das Array wurde damit komplett initialisiert.

Was wurde nun womit initialisiert? Die Zählung beginnt wie üblich mit 0. Das heißt, der Wert 1 gehört zu daten[0][0], 2 gehört zu daten[0][1], 3 zu daten[1][0], 4 zu daten[1][1], 5 zu daten[2][0] und 6 zu daten[2][1].
/* edit by Kerli: Quotetags eingefügt. */

Ich habe mehrere Fragen:
- Das Array hat 6 Elemente. Macht das einen Unterschied on ich es daten[3][2] oder daten[2][3] schreibe?
- Wieso werden bei einem 2 dimensionalen Array 6 Daten in dieser Weise initialisiert? Warum nicht { {1,2,3},{4,5,6} }? Fände ich logischer...
- Und kann mir jemand bitte erklären, warum z.b. der Wert 4 zu daten[1][1] gehört und 6 zu daten[2][1]?

Wahrscheinlich sind das ziemlich einfache Dinge, die auf der Hand liegen, mir aber "noch" nicht.
danke schonmal

Re: 2 dimensionales array

Verfasst: Mo Mär 09, 2009 2:32 pm
von Jside
- Das Array hat 6 Elemente. Macht das einen Unterschied on ich es daten[3][2] oder daten[2][3] schreibe?
Ja:
data[3][2] ) { { [...], [...] },{ [...], [...] },{ [...], [...] }}
data[3][2] ) { { [...], [...], [...] },{ [...], [...], [...] }}

Die NULL gilt übrigends auch als Zahl, daher hast du 4 Arrays, wenn du eine 3 hinsetzt. Ob du die NULL mitbenutzt, oder nicht liegt bei dir.
- Wieso werden bei einem 2 dimensionalen Array 6 Daten in dieser Weise initialisiert? Warum nicht { {1,2,3},{4,5,6} }? Fände ich logischer...
Sagen wir es mal so:
char *sprache[2][2] = {{"Hallo", "Hallo(sie)!"}, {"Hello","Hello(you)"}};

Ich hoffe, das ich dich bei deinen fragen richtig interpretiert habe...

Re: 2 dimensionales array

Verfasst: Mo Mär 09, 2009 4:06 pm
von Dirty Oerti
Tag :)
Macht das einen Unterschied on ich es daten[3][2] oder daten[2][3] schreibe?
Ohja.
daten[3][2] führt dazu, dass du 3 Arrays mit je 2 Werten drinn bekommst.
daten[2][3] führt dazu, dass du 2 Arrays mit je 3 Werten drinn bekommst.
Wieso werden bei einem 2 dimensionalen Array 6 Daten in dieser Weise initialisiert? Warum nicht { {1,2,3},{4,5,6} }? Fände ich logischer...
Das hängt eben davon ab, wozu du dein Array benutzen willst.
Um jsides Erklärung mal aufzugreifen:

Angenommen, du schreibst ein Programm, das verschiedene Sprachen unterstützt.
Du speicherst alle Sätze zentral, in einem Array.

Das würde so aussehen:

Code: Alles auswählen

char *text[2] = {"Ein erster Satz", "Hallo!"};
Benutzen tust du das so:

Code: Alles auswählen

printf("%s",text[0]);
Die Ausgabe wäre hier: "Ein erster Satz"

Wenn du nun eben mehrere (im Beispiel 3) Sprachen unterstützen willst kannst du das ganz einfach so machen:

Code: Alles auswählen

char *text[3][2] = { {"Ein erster Satz", "Hallo!"}, {"A first sentence", "hello!"}, {"a ersta satz", "servus"} };
Nun kannst du ganz einfach die Sprache wechseln:

Code: Alles auswählen

const unsinged int DEUTSCH = 0;
const unsigned int ENGLISCH = 1;
const unsigned int DIALEKT = 2;


// Sprache einlesen, z.b. über Umgebungsvariablen o.ä.

unsinged int sprache = DEUTSCH;
printf ("%s\n", text[sprache][0]);
sprache = ENGLISCH;
printf ("%s\n", text[sprache][0]);
sprache = DIALEKT;
printf ("%s\n", text[sprache][0]);

/*** AUSGABE ::: 
Ein erster Satz
A first sentence
a ersta satz
***/

Und kann mir jemand bitte erklären, warum z.b. der Wert 4 zu daten[1][1] gehört und 6 zu daten[2][1]?
Das man bei 0 zu zählen anfängt weißt du, oder?

MfG
Daniel

Re: 2 dimensionales array

Verfasst: Mo Mär 09, 2009 4:30 pm
von Kerli
Jside hat geschrieben:Die NULL gilt übrigends auch als Zahl, daher hast du 4 Arrays, wenn du eine 3 hinsetzt. Ob du die NULL mitbenutzt, oder nicht liegt bei dir.
Nein. Das ist absoluter Schwachsinn!

Die Syntax für Array lautet in einer Pseudo-Regex-Notation:

Code: Alles auswählen

Datentyp Name([Anzahl])+;
Wem Regex oder diese Notation nichts sagt: das '+' drückt einfach aus, dass der Teil innerhalb der Klammern mindestens einmal vorkommen muss.


Der wichtige Teil daran ist der Teil, der mit 'Anzahl' benannt ist, da er schon recht genau angibt was er darstellen soll. Also bedeutet es wenn du eine 3 hineinschreibst, dass du auch drei Element hast. Da in C/C++ die Zählung aber bei 0 beginnt läuft der Index nur von 0 bis 2. Würdest du eine 1 hinschreiben hast du auch nur ein Element das du dann mit dem Index 0 ansprechen kannst.

Wie das mit der Reihenfolge ausschaut haben ja meine "Vorposter" schon einigermaßen erklärt ;) Wichtig daran ist eigentlich nur, dass du immer mit der Anzahl der Element von Links nach Rechts gehen musst. Also ein Array 'int arr[3][4][5];' ist zb ein Array mit 3 Elementen. Jedes dieser Element ist wieder ein Array das dieses Mal aus 4 Element besteht. Jetzt sind wir schließlich bildlich am Ende des Baumes angekommen, wo jedes Element 5 Integerwerte beinhaltet.

Re: 2 dimensionales array

Verfasst: Mo Mär 09, 2009 4:40 pm
von cloidnerux
Du kannst dir einen 2 Dimensoinalen Array Als Schachbrett mit Beliebeigen anzahlen Felder Vertikal und Horizontal vorstellen.
Wenn du jezt sagts, das dein "Schachfeld"(=Array) 3 Felder Horizontal und 2 Felder Vertikal hat(array[3][2]) dann 2 Reihen á 3 Felder. Wenn du aber sagst das du 2 Felder Horizontal und 3 Felder Vertikal haben willst, dann hast du 3 Reihen à 2 Felder.
Jezt beginnt man wie beim schach die Felder zu Numerieren. Spalte eins hat damit die Nummer 0, Spalte zwei die Nummer 1.....
Die Reihe 1 hat die wiederrumm die Nummer 0 .......
In jedes Feld kannst du jezt Daten Schreiben, die Mit ihren nachbarfeldern nichts zu tun haben also ist es für den Computer egal was du wo reinschreibst.

Re: 2 dimensionales array

Verfasst: Di Mär 10, 2009 1:07 am
von Xin
Jside hat geschrieben:
- Das Array hat 6 Elemente. Macht das einen Unterschied on ich es daten[3][2] oder daten[2][3] schreibe?
Ja:
data[2][3] ) { { [...], [...] },{ [...], [...] },{ [...], [...] }}
data[3][2] ) { { [...], [...], [...] },{ [...], [...], [...] }}

Die NULL gilt übrigends auch als Zahl, daher hast du 4 Arrays, wenn du eine 3 hinsetzt. Ob du die NULL mitbenutzt, oder nicht liegt bei dir.
Das stimmt so nicht. Eine NULL wird nie angefügt. Hier (data[3][2] wird ein Array von 2 Elementen mit jeweils drei Elementen eingefügt. Das sind genau 6. Adressierbar sind sie von data{0..2][0..1]. Das erste ist immer mit 0 anzusprechen, es sind 3 bzw. 2 Elemente, also ist das letzte Element 2 bzw. 1.

Folgendes an JSide, das sind Informationen, die 8bit erst später benötigt.
NULL ist ein Zeiger, der Nullpointer, und sollte nicht als Zahl verstanden werden - auch wenn man es so kompilieren kann. Der einzige Fall, das ein Array mit einem Nullbyte (nicht NULL, sondern '\0’!) abgeschlossen wird, ist wenn es über einen String initialisiert wird:

Code: Alles auswählen

char const string[] = "Hallo Welt";
@8bit: Woher der Name, schon länger mit Computern unterwegs, oder einfach nur ein Fan alter Compuer?