Erstellen Sie eine Struktur mit 1D-Arrays. Wenn Sie jedoch dieser Methode folgen, können Sie neue Arrays erstellen, aber es wird ein Funktionsaufruf sein, um Größen und Werte zu ändern. Ein Dynamic-Matrix-Ansatz könnte Ihrem Problem nahe kommen.
2D-Arrays in malloc
werden in zusammenhängenden Speicherorten gespeichert. Also, wenn Sie nicht die Anzahl der Zeilen oder die Anzahl der Spalten angeben, wie weiß der Compiler, wie viele Zeilen und Spalten es gibt?
Bei einer Zeilenhauptmatrix befinden sich die Zeileninhalte an zusammenhängenden Speicherpositionen. Sie müssen also mindestens die Anzahl der Spalten angeben. Entsprechend müssen Sie für eine Spaltenhauptmatrix mindestens die Anzahl der Zeilen angeben. Ob es sich um eine Zeilenhaupt- oder eine Spaltenhauptschrift handelt, wird durch die Architektur definiert. Es scheint, dass das, was Sie haben, eine Reihe Hauptarchitektur ist.
Keine direkte Antwort auf diese Fragen im ursprünglichen Beitrag, ich möchte nur darauf hinweisen, dass das, was der Fragesteller vorschlägt, vielleicht keine so gute oder nützliche Idee ist.
Der Compiler kann tatsächlich von
ableiten %Vor% die Struktur von gcc
.
Wenn Sie jedoch eine Funktion deklarieren und definieren möchten (diese Deklaration und Definition könnte in einer anderen Kompilierungseinheit oder Quelldatei sein), die %code% als eines ihrer Argumente akzeptiert, müssen Sie noch etwas wie
%Vor%Der Compiler benötigt diese %code% , um die richtige Zeigerarithmetik in %code% auszuführen.
Normalerweise definieren wir %code% als ein Makro, das in einer Headerdatei durch eine ganze Zahl ersetzt wird, und verwenden es in den Definitionen von %code% und %code% :
%Vor%Dadurch ist es einfach sicherzustellen, dass sie gleich sind. Und lassen Sie den Compiler die Struktur von %code% entsprechend seiner Initialisierung ableiten, wenn Sie eine falsche Initialisierung geben, führen Sie tatsächlich einen Fehler in Ihrem Code ein.
Sie können dies mit dem C99-Verbindungs-Literal-Feature tun.
Eine Teilidee ist, dass die Länge einer Initialisierungsliste wie folgt bestimmt werden kann:
%Vor%Wir brauchen eine Umgehung dafür, dass die einzige Möglichkeit, ein Argument mit einem Komma an ein Makro zu übergeben, darin besteht, Klammern um das Argument zu setzen:
%Vor%Dann leitet das folgende Makro die zweite Dimension von der ersten Zeile ab:
%Vor%Es funktioniert nur, wenn mindestens zwei Zeilen vorhanden sind.
Beispiel:
%Vor%Sie möchten das wahrscheinlich nicht in einem echten Programm verwenden, aber es ist möglich.
Um diese Art von Array an Funktionen zu übergeben, ist die C99-Array-Funktion mit variabler Länge nützlich, mit einer Funktion wie:
%Vor%wird wie folgt aufgerufen:
%Vor%Nein, du kannst es nicht tun. Wenn Sie nicht initialisieren, können Sie kein int-Array [] [];
Sie können dies mit dem C99-Verbindungs-Literal-Feature tun.
Eine Teilidee ist, dass die Länge einer Initialisierungsliste wie folgt bestimmt werden kann:
%Vor%Wir brauchen eine Umgehung dafür, dass die einzige Möglichkeit, ein Argument mit einem Komma an ein Makro zu übergeben, darin besteht, Klammern um das Argument zu setzen:
%Vor%Dann leitet das folgende Makro die zweite Dimension von der ersten Zeile ab:
%Vor%Es funktioniert nur, wenn mindestens zwei Zeilen vorhanden sind.
Beispiel:
%Vor%Sie möchten das wahrscheinlich nicht in einem echten Programm verwenden, aber es ist möglich.
Um diese Art von Array an Funktionen zu übergeben, ist die C99-Array-Funktion mit variabler Länge nützlich, mit einer Funktion wie:
%Vor%wird wie folgt aufgerufen:
%Vor% 2D-Arrays in C
werden in zusammenhängenden Speicherorten gespeichert. Also, wenn Sie nicht die Anzahl der Zeilen oder die Anzahl der Spalten angeben, wie weiß der Compiler, wie viele Zeilen und Spalten es gibt?
Bei einer Zeilenhauptmatrix befinden sich die Zeileninhalte an zusammenhängenden Speicherpositionen. Sie müssen also mindestens die Anzahl der Spalten angeben. Entsprechend müssen Sie für eine Spaltenhauptmatrix mindestens die Anzahl der Zeilen angeben. Ob es sich um eine Zeilenhaupt- oder eine Spaltenhauptschrift handelt, wird durch die Architektur definiert. Es scheint, dass das, was Sie haben, eine Reihe Hauptarchitektur ist.
Keine direkte Antwort auf diese Fragen im ursprünglichen Beitrag, ich möchte nur darauf hinweisen, dass das, was der Fragesteller vorschlägt, vielleicht keine so gute oder nützliche Idee ist.
Der Compiler kann tatsächlich von
ableiten %Vor% die Struktur von multi_array
.
Wenn Sie jedoch eine Funktion deklarieren und definieren möchten (diese Deklaration und Definition könnte in einer anderen Kompilierungseinheit oder Quelldatei sein), die multi_array
als eines ihrer Argumente akzeptiert, müssen Sie noch etwas wie
Der Compiler benötigt diese COL
, um die richtige Zeigerarithmetik in foo()
auszuführen.
Normalerweise definieren wir COL
als ein Makro, das in einer Headerdatei durch eine ganze Zahl ersetzt wird, und verwenden es in den Definitionen von multi_array
und foo()
:
Dadurch ist es einfach sicherzustellen, dass sie gleich sind. Und lassen Sie den Compiler die Struktur von multi_array
entsprechend seiner Initialisierung ableiten, wenn Sie eine falsche Initialisierung geben, führen Sie tatsächlich einen Fehler in Ihrem Code ein.
Tags und Links c arrays gcc initialization