Denkfehler: Übergabe eines Arrays an eine Funktion zur Veränderung
-
Hey,
ich möchte ein zweidimensionales 3x3-Array an eine Funktion übergeben und es innerhalb bearbeiten, aber irgenwie stelle ich mich zu blöd an.
void f(float* pArr[3][3]){ //... }; float arr[3][3]; f(&arr);ich hab bisher schon herausgefunden, dass ich schon mal keine Referenz auf das Array übergeben darf. Neben der Methode oben, habe ich auch folgendes probiert:
void f(float* pArr[][]){ //... }; void f(float*** pArr){ //... };Leider funktioniert nichts von alledem. Ich hab wahrscheinlich einfach nur irgendwo einen blöden Denkfehler oder so.
Hoffe ihr könnt mir helfen!
Danke!!
Grüße,
anchelito
-
anchelito schrieb:
Hey,
ich möchte ein zweidimensionales 3x3-Array an eine Funktion übergeben und es innerhalb bearbeiten, aber irgenwie stelle ich mich zu blöd an.
void f(float* pArr[3][3]){ //... }; float arr[3][3]; f(&arr);Rechtsseitige Deklaratoren haben Vorrang vor linksseitigen - genauso wie die gleichaussehenden Operatoren in Ausdrücken.
float* pArr[3][3]ist äquivalent zu
float* ((pArr[3])[3])Also ein zweidimensionales Array aus Zeigern auf float - was du wolltest, war aber ein Zeiger auf ein zweidimensionales Array aus float. Mit runden Klammern können wir auch hier den Vorrang ändern:
float (*pArr)[3][3]ist das gewünschte. So ein Zeiger ist allerdings etwas unhandlich, da man ihn erst einmal dereferenzieren muss, bevor der Indexoperator angewendet werden kann:
(*pArr)[x][y]ich hab bisher schon herausgefunden, dass ich schon mal keine Referenz auf das Array übergeben darf.
Das ist nicht wahr, vermutlich hast du versucht, ein Array aus Referenzen (das geht generell nicht) zu deklarieren.
float (&pArr)[3][3]funktioniert wunderbar und verliert keine Typinformationen.
Möglich ist außerdem
float (*pArr)[3]aber hier ist uns der Gröe einer Dimension verloren gegangen, alternativ könntest dafür schreiben
float [][3]oder
float [irgend_eine_zahl][3]die erste Dimension wird bei so einer "per-Value"-Deklaration ignoriert - der Compiler verändert die Deklaration immer zu der zweiten angegebenen Möglichkeit
float (*pArr)[3]da Arrays nicht per value übergeben werden können.
-
danke erst mal für die Antwort!!
ich bin aber gerade selbst auf eine antwort gekommen. und zwar ist es ja nicht mal nötig, dass so kompliziert zu lösen, da ein array ja eh in einen zeiger auf das erste element konvertiert wird. demzufolge dürfte es auch reichen einfach folgendes zu machen:
void f(float arr[3][3]){ // .. }oder liege ich da falsch??? es funktioniert jedenfalls. die änderungen sind draußen auch vorhanden und performance-technisch dürfte es gegenüber deiner version doch auch nicht schlechter sein, als deine version, oder???
Grüße,
anchelito[edit] ... ups ... diese version hast du ja sogar vorgeschlagen ... daher erübrigt sich die frage. danke!