Wie pass 2D array (matrix) in eine Funktion in C?
Ich tun müssen, um diese zu bestehen Operationen auf der matrix als auch. Heißt das, es muss per Referenz übergeben werden?
Wird dies ausreichen?
void operate_on_matrix(char matrix[][20]);
InformationsquelleAutor Shweta | 2010-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
C nicht wirklich multi-dimensional arrays, aber es gibt mehrere Möglichkeiten, um zu simulieren. Der Weg zu passieren solche arrays an eine Funktion hängt von der Art und Weise simuliert, in der mehrere Dimensionen:
1) Verwenden Sie ein array von arrays. Dies kann nur verwendet werden, wenn der array-Grenzen sind bestimmt voll zur compile-Zeit, oder wenn Ihr compiler unterstützt VLA ist:
2) Verwenden Sie eine (dynamisch zugewiesene) array von Pointern, die (dynamisch vergebene) arrays. Dies wird meistens benutzt, wenn die array-Grenzen sind erst zur Laufzeit bekannt.
3) Verwenden Sie ein 1-dimensionales array und Korrektur der Indizes. Dies kann verwendet werden, sowohl statisch zugewiesen (Feste Größe) und auch mit dynamisch zugewiesenen arrays:
4) Verwenden Sie einen dynamisch zugewiesenen VLA. Ein Vorteil dieser gegenüber option 2 ist, dass es eine single memory allocation; ein weiterer ist, dass weniger Speicherplatz benötigt wird, da das array von Zeigern ist nicht erforderlich.
(Siehe
srand()
— warum nennt man das nur einmal?.)void func_vla(int array[rows][cols], int rows, int cols)
solltevoid func_vla(int rows, int cols, int array[rows][cols])
Die VLA-notation verwendet, die in den Zeilen 17 und 35 korrekt ist, wenn der compiler C99 unterstützt, oder wenn es unterstützt C11 und nicht definieren
__STDC_NO_VLA__
. Wenn der compiler unterstützt nicht VLAs, dann ist es natürlich nicht kompilieren.malloc liefert einen void-Zeiger, werden Sie sicher, dass Sie nicht brauchen, um es umwandeln in int* und int** wie und Wann erforderlich? Lösung 2
diese Konvertierung ist implizit durchgeführt Ci
InformationsquelleAutor Bart van Ingen Schenau
Ich weiß nicht, was du meinst mit "Daten-dont get lost". Hier ist, wie Sie an einem normalen 2D-array an eine Funktion:
Daten nicht verloren gehen, bedeutet ohne Verwendung von malloc. Vielen Dank für die Hilfe.
Mann: Das ist eine gute factoid. Ich hatte zu schreiben, eine ausführliche Erläuterung auf heute 🙂 stackoverflow.com/questions/3906777/...
Es scheint, jeder hat Probleme, die mit multi-dimensionalen arrays heute. 🙂 Ich schrieb eine ähnliche Erklärung in einer anderen Frage zu: stackoverflow.com/questions/3911244/...
Vielmehr ist der Grund die array-syntax überhaupt funktioniert, da der compiler passt die array-Deklaration für den parameter einen Zeiger auf das erste element, in diesem Fall
int (*)[N]
. Und das ist auch der Grund, warum alle Dimensionen, sondern die äußeren-die meisten haben zur Verfügung gestellt werden - das array nur zerfällt einmal. Das hat absolut nichts damit zu tun, was "der computer wissen muss" - Quatsch. Vergleichen Sie es mit dem 1D-Fall:void func (int [n])
, die wird angepasst, umvoid func (int*)
und alle Angaben zu Größe, ist verloren - "der computer" nicht bekomme zu einer Sache wissen und der compiler konnte nicht weniger kümmern.InformationsquelleAutor casablanca
Einfachste Weg: Übergeben Einer Variable-Länge 2D Array
die Meisten saubere Technik für C & C++: pass 2D-array wie ein 1D-array, dann als 2D-innerhalb der Funktion.
InformationsquelleAutor Minhas Kamal
2D-array:
3D-array:
4D-array:
- und nD-array:
InformationsquelleAutor shinxg
Wenn Ihr compiler nicht unterstützt VLAs, Sie können es auf einfache Weise, indem Sie die 2d-array als int* mit row und col.
In der empfangenden Funktion regenerieren den 1d-array-index von 2d-array-Indizes.
col
nichtrow
zugetid()
um die korrekte Berechnung, wenn die matrix nicht quadratisch ist. Man könnte das vernünftig machen, die Funktionstatic inline int getid(int cols, int x, int y) { return (x * cols + y); }
. Die notationmain()
ist falsch — C99 erfordert einen expliziten Rückgabetyp. Sollten Sie verwendenint main(void)
; Sie kann (sollte aber nicht) verwendenint main()
aber die leeren Klammern sind technisch veraltete.InformationsquelleAutor Rajneesh Gupta
InformationsquelleAutor Casper Ghost