laparmakerli hat geschrieben:Hallo,
Ich habe ein kleines Verständnisproblem zur Übergabe von mehrdimensionalen Arrays als Parameter.
Ich vermute, dass hier kaum Feedback kommt, ist da C hier keine wirklich schöne Syntax zu bieten hat...
laparmakerli hat geschrieben:Also, ich übergebe der Funktion <test(int arr[4][3])> ein zweidimensionales array, wobei ich explizit angebe wie viele "zeilen" und "spalten" das array haben soll. Ich weiß, dass eigentlich nur die 2. (und alle weiteren) Dimensionen angegeben werden müssen. Allerdings scheint es so als würde der Compiler die Angabe der ersten Dimension ignorieren, da "sizeof(arr)" 8-byte (also die größe eines zeigers bei 64 bit rechnern) und nicht die größe des arrays liefert.
Er wird da vermutlich auch einen Zeiger übergeben und nicht das Array, denn etwas, was mit [] zugegriffen werden kann, muss ein Array sein. Arrays, also char[] gibt es in C aber gar nicht, sondern es gibt immer nur den Zeiger auf das erste Element.
laparmakerli hat geschrieben:Er verhält sich also genauso, als hätte ich "int arr[][3]" als Parameter angegeben. Für sizeof(arr[0]) wird jedoch wie erwartet die grüße einer gesamten zeile (also 3 * 4 byte) ausgegeben. Hab ich da was falsch verstanden? oder wenn nicht, wieso ignoriert der Compiler die angabe?
Mit einer klaren Erklärung tue ich mich hier auch schwer und kann eben nur auf das zuvor beschriebene verweisen. Entweder verlangt der Standard es so oder es ist tatsächlich ein Fehler. Ich stimme mit Dir überein, dass ich die gleiche Erwartungshaltung wie Du hätte, nämlich 4*3*sizeof(int) => 48. Dieses Konzept würde allerdings bedeuten, dass C/C++ ein statisches Konzept Array haben müsste, dass die Verschachtlung von Arrays ausdrücken könnte.
Die Verwendung von mehrdimensionalen Arrays in C/C++ sehe ich sehr selten. In meinem Fall auch der Tatsache geschuldet, dass die Typinformationen nicht sauber über Funktionsaufrufe zu leiten sind.
Üblicher ist es, diese Dinge in Strukturen zu packen:
Code: Alles auswählen
struct DataRow
{
int _data[3];
};
struct DataBlock
{
struct DataRow _data[4];
};
Der Zugriff ist aufwendiger, bzw. in C++ musst Du halt operator [] definieren.
Dafür wird die Sache weniger fraglich.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.