vorbei statisch zugeordneten 2D-arrays als Funktionsparameter in C
Betrachten Sie diesen code:
#include <stdio.h>
#define N 5
void printMatrix(int (*matrix)[N],int n)
{
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d",matrix[i][j]);
printf("\n");
}
}
int main()
{
int R[N][N]={{1,2,3},{4,5,6},{7,8,9}};
printMatrix(R,3);
}
Dies funktioniert gut, wie erwartet.
Nun, ich dachte zu schreiben, die Funktionen Umgang mit 2D-Matrizen in einer separaten Quelldatei, und verknüpfen Sie Sie wo immer Sie benötigt werden.
Dann aber lief ich in ein problem, wie in der Funktion printMatrix
die Größe des Arrays von int
auf die matrix
Punkte (ich.e N
) ist erforderlich zur compile-Zeit. So, meine Funktionen nicht funktionieren würde, in anderen Fällen, wenn die Größe unterschiedlich ist.
So,Wie kann ich das umgehen?
Dynamische Arrays sind eine Lösung, aber ich möchte wissen, ob es kann getan werden, mit statischen arrays.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht verwenden Sie die integrierte 2D-array-Typ, wenn beide Größen sind zur Kompilierzeit nicht bekannt. Ein integriertes 2D-array muss mindestens eine der beiden Größen bekannt, die zur compile-Zeit.
Wenn beide Größen sind run-time-Werte, dann haben Sie keine andere Wahl, sondern um eine "manuelle" Durchführung von 2D-array wie ein array von Zeigern auf arrays, zum Beispiel. In diesem Fall die Deklaration der Funktion könnte wie folgt Aussehen (alternativ zwei äquivalente Formen)
Zugriff auf die array-Elemente können Sie immer noch die "traditionellen" syntax
Dem array selbst würde wie folgt erstellt werden (ein einfaches Beispiel)
Aber wenn Sie haben bereits eine matrix implementiert, die als 2d-array
dann nur in der Lage sein, um es zu übergeben, um die oben beschriebene Funktion können Sie "konvertieren" in der oben genannten form durch den Einsatz einer zusätzlichen temporären "row-pointer" array
int *rows[2]
. Behoben. Danke.Schreiben Sie sich ein makro:
und erklären, "matrix" als eine einfache pointer zu einem "int".
Berechnung des array-index selbst. Dies Griff eine beliebige zwei-dimensionale array, zum Beispiel:
Versuchen Sie nicht, es weiterzugeben, als eine 2-D-array; übergeben Sie einen Zeiger auf das erste element, dann berechnen offsets manuell:
Gewährt, dies funktioniert nur bei zusammenhängend zugewiesenen arrays.
Obwohl die syntax ist nicht genau das gleiche, aber das passiert auch ein bisschen arbeiten: