Pointer auf mehrdimensionale Arrays
-
Hej,
ich habe per:int nSize = 10; int *pMap = new int[nSize*nSize];
ein ein Feld der Groesse 10*10 (100) erzeugt und das halt nem Pointer zugewiesen.
Mit der folgenden Schleife setze ich das gesamte Feld dann auf 0, was auch klappt.for(int x=0; x<nSize; x++) for(int y=0; y<nSize; y++) *(pMap+x+y) = 0;
Jetzt zu meiner Frage:
Bei nem direkten Feld, also
int nFeld[10][10];
kann ich ja z.b. das machen:
nFeld[3][7] = 3;
Aber wie kann ich dies mit Hilfe des Pointers machen?
So gehts leider net:
*(pMap+3+7) = 3;ByeBye, Viking69
-
Mit der Schleife erreichst du nicht das ganze Feld. Du musst mit y*Breite+x indizieren.
Zu deiner Frage: Du solltest das manuelle schreiben vermeiden, wozu gibts denn Indexoperatoren? int *p=pMap[3][7]; *p=3;
Präzisier mal deine Frage
-
Hallo,
- du hast kein mehrdimensionales Array erzeugt
- das gesamte Array wird standardmäßig auf Null gesetzt, weil es aus Builtin-Typen besteht, d. h. auf deine Schleife kannst du getrost verzichten
- *(pMap+3+7) = 3; setzt pMap[10] auf 3
-
Hej,
dieser Code geht leider net:int *p=pMap[3][7]; *p=3;
Genauer gesagt er meckert das an: pMap[3][7]
Das Problem:
Wie verschiebe ich den Zeiger so, dass ich auf dem gewuenschten Element bin?
In nem eindimensionalen Array kann ich ja einfach folgendes machen:int *pFeld = new int[10]; *(p+2) = 3;
ByeBye, Viking69
-
Hej,
mh ok, wie erzeuge ich denn ein 2-dimensionales?
Es soll auf jedenfalls dynamsich erzeugt werden koennen.
Und wie greife ich darauf zu?
ByeBye, VIking69
-
Hallo,
schau mal hier:
http://www.c-plusplus.net/forum/viewtopic.php?t=58906
http://www.c-plusplus.net/forum/viewtopic.php?t=36422&highlight=mehrdimensionales+array
-
Viking69 schrieb:
dieser Code geht leider net:
int *p=pMap[3][7]; *p=3;
Genauer gesagt er meckert das an: pMap[3][7]
Das war auch nur ein Beispiel. Du musst schon selbst schauen, wie du das in deinem Programm integrierst. Abgesehen davon, du hast ja kein zweidimensionales Array, schließlich schreibst du nSize*nSize, und das ist 100, aber nicht zweidimensional.
Ein zweidimensionales Array ist eigentlich ein Array von Zeigern, die wiederum auf einen Speicherbereich zeigen (also selbst arrays sind). Wenn du darüber ein bisschen nachdenkst, kannst du ein solches Array auch selber deklarieren. Für dynamische Speicherbeschaffung brauchst du ja nur einen Pointer und das Schlüsselwort new
-
Hi!
Habe dazu gerade auch mal beim rumprobieren ein Problem festgestellt.
Mache ich etwas falsch oder kriegt der MS-Compiler das wirklich nicht gebacken?:int pMap[10][20]; int x=3, y=7; pMap[x*sizeof(pMap[0])+y] = 5;
Ich rechne nur auf einen Index um, es kommt aber folgende Fehlermeldung:
c:\....\main.cpp(15): error C2440: '=': 'int' kann nicht in 'int [20]' konvertiert werden
Die Fehlermeldung kommt auch wenn ich eine Zuweisung so tätigen will. Intern werden die doch als Eindimensionales Feld behandelt.
Code-Hacker
-
Die Formel y*Breite+x betrifft nur eindimensionale Arrays, die wie zweidimensionale Arbeiten sollen. Außerdem ist mit Breite nicht sizeof (datentyp) gemeint, sondern z.B. 10, für ein [20][10] Array (20 währe die höhe).Edit: Wenn der Compiler einen Fehler meldet, darfst du grundsätzlich davon ausgehen, das du und nicht der Compiler einen Fehler gemacht hast.
-
Hi!
@Randa:
Achso, hatte gelesen das 2 dimensionale Array wirklich so abgebildet werden können.EDIT: Wobei ich mit sizeof(feld[0]) doch eigentlich die Größe der Breite bekommen müsste oder? Also eigentlich 20, bekomme allerdings 80 raus.
EDIT: Argh. Hat sich erledigt!
Code-Hacker
-
nein, sizeof (feld[0]) ist die größe der Varaiblen feld[0], und das ist bei zweidimensionalen Arrays ein Zeiger und hat immer die größe 4 bytes bzw. 8 bytes bei 64 Bit Systemen.
-
Hi!
Jepp, genau das ist mir eben auch wieder klar geworden. Peinlich irgendwie, genau das habe ich noch für ne Klausur gelernt (richtig!) und auch noch mit anderen diskutiert und erklärt und jetzt mache ich es selbst falsch...
EDIT: So wäre es richtig gewesen:
(sizeof(myMap)/sizeof(myMap[0][0])) / (sizeof(myMap)/sizeof(myMap[0]))
Code-Hacker
-
Hej,
so jetzt gehts wie ichs will
Danke an alle fure die schnellen Antworten
ByeBye, Viking69
-
randa schrieb:
nein, sizeof (feld[0]) ist die größe der Varaiblen feld[0], und das ist bei zweidimensionalen Arrays ein Zeiger und hat immer die größe 4 bytes bzw. 8 bytes bei 64 Bit Systemen.
Nö
int a[10][50]; cout << sizeof(a[0]); // = sizeof(int) * 50
-
Hi!
Argh, ich lese auch nur die hälfte....
Allgemein:
a[0] ist bei einem zweidimensionalen Array
Größe des Datentyps * Größe der zweiten DimensionCode-Hacker
-
Code-Hacker schrieb:
Hi!
Argh, ich lese auch nur die hälfte....
Allgemein:
a[0] ist bei einem zweidimensionalen Array
Größe des Datentyps * Größe der zweiten DimensionCode-Hacker