Kann ein zweidimensionales Array in C ohne explizite Größe initialisiert werden?

9
___ qstnhdr ___ Kann ein zweidimensionales Array in C ohne explizite Größe initialisiert werden? ___ answer22100929 ___

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.

    
___ answer22100509 ___

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.

    
___ answer22101951 ___

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.

    
___ answer22107575 ___

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%     
___ answer23874732 ___

Nein, du kannst es nicht tun. Wenn Sie nicht initialisieren, können Sie kein int-Array [] [];

    
___ tag123initialisierung ___ Die Initialisierung beschäftigt sich mit der Aufgabe, den Inhalt Ihrer Datenstruktur zu initialisieren. Es ist eine gängige Praxis in statisch typisierten Sprachen. ___ tag123gcc ___ GCC ist die GNU Compiler-Sammlung. Es ist der De-facto-Standard-C-Compiler unter Linux und unterstützt auch viele andere Sprachen und Plattformen. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___
Wojciech Gac 28.02.2014, 16:19
quelle

5 Antworten

2

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%     
jilles 28.02.2014 23:12
quelle
1

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.

    
Rikayan Bandyopadhyay 28.02.2014 16:25
quelle
0

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.

    
Jakeloyd 28.02.2014 16:44
quelle
0

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

%Vor%

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() :

%Vor%

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.

    
Lee Duhem 28.02.2014 17:31
quelle
0

Nein, du kannst es nicht tun. Wenn Sie nicht initialisieren, können Sie kein int-Array [] [];

    
fahim 26.05.2014 16:58
quelle

Tags und Links