ungültige Verwendung von flexiblem Array - flexibles Struct-Array als Mitglied einer anderen Struktur

8

Ich fange an, über die Verwendung von Strukturen in C zu lernen. Es ist herausfordernd und unterhaltsam. Unnötig zu sagen, dass ich auf ein Problem gestoßen bin, das ich nicht herausfinden kann. Ich versuche, ein flexibles Struct-Array als Mitglied einer anderen Struktur zu machen, aber ich bekomme einen Fehler:

  

ungültige Verwendung von flexiblem Array

Was mache ich falsch?

%Vor%

BEARBEITEN 1

So etwas versuche ich zu erreichen

flexible Länge struct Array innerhalb einer anderen Struktur mit C

EDIT 2 *

O.K, so scheint es, als würde ich mich der Erstellung eines Arrays variabler Größe von struct auf die falsche Art nähern. Ich habe 2 Dinge, die ich versuche. Die erste, die ich kenne, funktioniert sicher. Die zweite würde ich nur gerne, wenn jemand vernünftig es für mich überprüfen könnte. Ich lerne immer noch über Zeiger und möchte wissen, ob A das gleiche wie B. B wäre meine bevorzugte Methode, aber ich weiß nicht, ob es korrekt ist. Ich bin zuversichtlich über eine, weil, wenn ich Kanäle debuggen sehe ich Kanal [0], Kanal [1] channel [2] usw. Aber ich bin nicht so zuversichtlich über B, denn wenn ich es debuggen sehe ich nur eine Adresse zu Speicher und Die Variablen der Channel-Struktur aufgelistet.

A

%Vor%

B

%Vor%

** EDIT 3 ****

Ja, sie sind gleich. Nicht sicher, wann du einen über den anderen benutzen würdest

%Vor%

Ist gleich:)

%Vor%     
dubbeat 07.12.2010, 17:31
quelle

2 Antworten

14

Bearbeiten

Ich denke, ich erinnere mich jetzt, was das Problem ist. Wenn Sie eine Struktur mit einem flexiblen Array als letztes Mitglied deklarieren, macht es etwas völlig anderes als Sie denken.

%Vor%

ist NICHT ein Zeiger, es ist ein In-Place-Array, das an die Struktur angrenzt.

Die Art und Weise, wie dies verwendet werden soll, besteht darin, die Struktur über einen vorhandenen Blockspeicher zu legen. Dies ist zum Beispiel beim Netzwerken hilfreich, wenn Sie ein Paket mit Daten variabler Länge haben. Sie könnten also etwas tun wie:

%Vor%

Wenn Sie ein Paket erhalten, werfen Sie einen Zeiger auf die Daten in einen mydata -Zeiger und dann sagt Ihnen das varDataSize -Feld, wie viel Sie haben. Wie ich schon sagte, die Sache, an die man sich erinnert, ist, dass es sich um einen zusammenhängenden Speicherblock handelt und data NICHT ein Zeiger ist.

Alte Antwort:

Ich denke, das ist nur im C99-Standard erlaubt. Versuchen Sie, mit dem -std=c99 -Flag zu kompilieren.

Siehe auch diesen Thread, Variablenarray in Struktur

Siehe auch diesen SO-Post: Flexible Array-Mitglieder in C - schlecht?

    
Robert S. Barnes 07.12.2010, 17:33
quelle
0
___ 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. ___ tag123struct ___ Ein Schlüsselwort in verschiedenen Programmiersprachen, deren Syntax C ähnelt oder von C abgeleitet ist (C ++, C #, Swift, Go usw.). Verwenden Sie ein spezielles Programmiersprachen-Tag, um Fragen zu markieren, die die Verwendung einer 'struct' als Syntax beinhalten, und Semantik kann sprachabhängig sein. Schlüsselwort definiert oder deklariert einen Datentyp, der aus anderen Datentypen besteht. Jedes Mitglied einer Struktur hat seinen eigenen Speicherbereich (im Gegensatz zu einer "Union", deren Mitglieder einen einzigen Speicherbereich teilen). ___ qstnhdr ___ ungültige Verwendung von flexiblem Array - flexibles Struct-Array als Mitglied einer anderen Struktur ___ antwort4380084 ___

Ich bin kein Experte in diesem C-Feature, aber mein gesunder Menschenverstand sagt mir, dass Sie keine Objekte vom Typ struct enginestruct , nur Pointer, definieren können. Dies betrifft die Variable engine in der folgenden Zeile:

%Vor%     
___ qstntxt ___

Ich fange an, über die Verwendung von Strukturen in C zu lernen. Es ist herausfordernd und unterhaltsam. Unnötig zu sagen, dass ich auf ein Problem gestoßen bin, das ich nicht herausfinden kann. Ich versuche, ein flexibles Struct-Array als Mitglied einer anderen Struktur zu machen, aber ich bekomme einen Fehler:

  

ungültige Verwendung von flexiblem Array

Was mache ich falsch?

%Vor%

BEARBEITEN 1

So etwas versuche ich zu erreichen

flexible Länge struct Array innerhalb einer anderen Struktur mit C

EDIT 2 *

O.K, so scheint es, als würde ich mich der Erstellung eines Arrays variabler Größe von struct auf die falsche Art nähern. Ich habe 2 Dinge, die ich versuche. Die erste, die ich kenne, funktioniert sicher. Die zweite würde ich nur gerne, wenn jemand vernünftig es für mich überprüfen könnte. Ich lerne immer noch über Zeiger und möchte wissen, ob A das gleiche wie B. B wäre meine bevorzugte Methode, aber ich weiß nicht, ob es korrekt ist. Ich bin zuversichtlich über eine, weil, wenn ich Kanäle debuggen sehe ich Kanal [0], Kanal [1] channel [2] usw. Aber ich bin nicht so zuversichtlich über B, denn wenn ich es debuggen sehe ich nur eine Adresse zu Speicher und Die Variablen der Channel-Struktur aufgelistet.

A

%Vor%

B

%Vor%

** EDIT 3 ****

Ja, sie sind gleich. Nicht sicher, wann du einen über den anderen benutzen würdest

%Vor%

Ist gleich:)

%Vor%     
___ answer4379703 ___

Bearbeiten

Ich denke, ich erinnere mich jetzt, was das Problem ist. Wenn Sie eine Struktur mit einem flexiblen Array als letztes Mitglied deklarieren, macht es etwas völlig anderes als Sie denken.

%Vor%

ist NICHT ein Zeiger, es ist ein In-Place-Array, das an die Struktur angrenzt.

Die Art und Weise, wie dies verwendet werden soll, besteht darin, die Struktur über einen vorhandenen Blockspeicher zu legen. Dies ist zum Beispiel beim Netzwerken hilfreich, wenn Sie ein Paket mit Daten variabler Länge haben. Sie könnten also etwas tun wie:

%Vor%

Wenn Sie ein Paket erhalten, werfen Sie einen Zeiger auf die Daten in einen %code% -Zeiger und dann sagt Ihnen das %code% -Feld, wie viel Sie haben. Wie ich schon sagte, die Sache, an die man sich erinnert, ist, dass es sich um einen zusammenhängenden Speicherblock handelt und %code% NICHT ein Zeiger ist.

Alte Antwort:

Ich denke, das ist nur im C99-Standard erlaubt. Versuchen Sie, mit dem %code% -Flag zu kompilieren.

Siehe auch diesen Thread, Variablenarray in Struktur

Siehe auch diesen SO-Post: Flexible Array-Mitglieder in C - schlecht?

    
___
anatolyg 07.12.2010 18:14
quelle

Tags und Links