Übergabe von 2 dimensonalen Arrays
-
Also du musst erstmal von mehrdiemensionalen Arrays wissen wie sie im Speicher liegen. Ich glaube zwar dass es vom Standard nicht genau vorgeschrieben ist aber normal ist es so:
nr[0][0] - nr[0][1] - nr[0][2] - nr[0][3] - nr[1][0] - [...]
Dass heisst alle Werte liegen im Speicher hintereinander. Nun beginnt die Funktion mit dem ersten Wert, dafür braucht man die Adresse davon. Die bekommt man per nr[0] oder &nr[0][0]. In der Funktion zeigt dann der Pointer p auf das erste Element. Wenn das geschrieben wurde "schiebt" die Funktion den Pointer p auf das Nächste Element weiter mit ++p. Das wiederholen wir jetzt eben n-mal, wobei n die Anzahl der Elemente des Arrays ist (hier 16). Am Ende zeigt p dann sogar auf das Element nach dem letzten aber das ist ja egal wir brauchen p nicht mehr.
Achja: Du übergibst eigentlich NIE das Array an sich, sondern nur die Adresse des Arrays, das machst du ja auch in der Funktion mit dem eindimensionalen Array.
Mir ist grade noch was neues gekommen wie man es auch machen könnte, aber wenn du erst Anfänger bist sagen dir Templates wahrscheinlich wenig...
template <unsigned int size_x, unsigned int size_y> void fuellen(int p[size_x][size_y]) { for(int a=0; a<size_x; ++a) { for(int b=0; b<size_y; ++b) { p[a][b] = a+b; } } } int main(int argc, char *argv[]) { int nr[4][4]; fuellen<4,4>(nr); system("PAUSE"); return EXIT_SUCCESS; }
-
Entweder:
void fuellen( int _nr[][4]) { }
oder
void fuellen( int(*_nr)[4]) { }
MfG Spacelord
-
Nunja das ist meiner Meinung nach ziemlich undynamisch... Ich will ja villeicht mal das Array vergrößern dass muss ich alle Funktionen umschreiben.
-
Ja erstmal THX raff ich wohl...
FireFlow schrieb:
Achja: Du übergibst eigentlich NIE das Array an sich, sondern nur die Adresse des Arrays, das machst du ja auch in der Funktion mit dem eindimensionalen Array.
}[/cpp]
Also ist das jetzt egal ob dann * davor setze weil ichen Array dann nur als Zeige übergeben kann?????
-
Marlon schrieb:
Ja erstmal THX raff ich wohl...
FireFlow schrieb:
Achja: Du übergibst eigentlich NIE das Array an sich, sondern nur die Adresse des Arrays, das machst du ja auch in der Funktion mit dem eindimensionalen Array.
}[/cpp]
Also ist das jetzt egal ob dann * davor setze weil ichen Array dann nur als Zeige übergeben kann?????
Wo davor? Normalerweise macht so ein * mehr oder weniger schon ein Unterschied
-
Bei meinem 1 dimensonalen war das ja
void fuellen( int *_nr[][4])
und bei dem neuen hab ich nu
void fuellen( int _nr[][4]
so geht das dann au.. nur bei
#include <cstdlib> #include <iostream> using namespace std; void fuellen( int *_nr[][4]) { } int main(int argc, char *argv[]) { int nr[4][4]; fuellen(nr); system("PAUSE"); return EXIT_SUCCESS; }
sagt der mir das daen Fehler dabei is.. wo ist den da der Unterschied?
-
FireFlow schrieb:
Nunja das ist meiner Meinung nach ziemlich undynamisch... Ich will ja villeicht mal das Array vergrößern dass muss ich alle Funktionen umschreiben.
Ist aber für Anfänger geeignet :p
Und das was du da über nen Template löst kriegst du auch mit stinknormalen Konstanten hin....MfG Spacelord
-
Der Unterschied ist:
int v[][4] = { ... }; // => ist ein 2-D-Array mit Elementen vom Typ int. int* v[][4] = { ... }; // => ist ein 2-D-Array mit Elementen vom Typ Zeiger auf int.
Caipi
-
aber eine Frage hätte ich noch. Wieso muss da ne 4 mit angeben werden??? Im Buch steht da nix drüber...wieso nicht int v[][] oder int* v[][]????
-
Caipi schrieb:
Der Unterschied ist:
int v[][4] = { ... }; // => ist ein 2-D-Array mit Elementen vom Typ int. int* v[][4] = { ... }; // => ist ein 2-D-Array mit Elementen vom Typ Zeiger auf int.
Caipi
Die Wirkung is aber gleich. Das Arry befindet sich immer noch im Orginalprogramm..oder?
-
Marlon schrieb:
aber eine Frage hätte ich noch. Wieso muss da ne 4 mit angeben werden??? Im Buch steht da nix drüber...wieso nicht int v[][] oder int* v[][]????
Das hat was mit dem Datentyp zu tun. int (*v)[4] ist ein Zeiger auf ein int Array mit 4 Elementen.Das ist der Datentyp von v !Diese Information braucht der Compiler um korrekte Zeigerarithmetik bieten zu können. So berechnet der Compiler etwa aus v+1 ne Speicheradresse die der Startadresse von v + die Größe von 4 ints entspricht.Dafür ist die Größenangabe der zweiten Dimension nötig.
MfG Spacelord