Strukturen in C lesen und schreiben

8

Ich weiß, dass Strukturen in C nicht wie im Code angeordnet sind. Zum Beispiel:

%Vor%

unter der Annahme von 2-Byte-Kurzschlüssen und 4-Byte-Ints nimmt kann tatsächlich 8 Bytes im Speicher, da der Compiler die Mitglieder auf 4-Byte-Grenzen ausrichten will ... also gibt es 2 Bytes Puffer zwischen x und y.

Dies macht das Lesen und Schreiben von Strukturen über Sprache, Compiler und Hardware nicht portierbar. Die einzige Möglichkeit, sie zu lesen und zu schreiben, ist Mitglied für Mitglied. Ja, Endianness ist auch hier ein Problem und der Austausch muss auf der Ebene der Mitglieder erfolgen, aber nehmen wir an, dies ist kein Problem.

Fortran hat einen 'Sequenz'-Spezifizierer für abgeleitete Typen (Strukturen), der den Compiler anweist, die Elemente im Speicher so anzuordnen, wie sie angegeben sind. Dies ermöglicht das portable Lesen und Schreiben von abgeleiteten Typen.

Meine Frage ist: Gibt es eine Möglichkeit, eine ähnliche Sache in C auf eine tragbare (und wartbare) Weise zu machen?

    
Mcfly 30.11.2014, 09:54
quelle

2 Antworten

5

Ja, Fortran 2003 führte den bind(C) -Spezifikator ein, der den Compiler anweist, genau dasselbe zu tun wie der Companion-C-Compiler

%Vor%

Zusätzlich definiert das iso_c_binding -Modul (ein Teil der gesamten Fortran 2003 C-Interoperabilität) Konstanten, die Ihnen helfen, die intrinsischen C- und Fortran-Typen zu verbinden:

%Vor%

Dieser Typ wird als interoperabel mit Ihrer C-Struktur bezeichnet.

Die C-Interoperabilität wird in Compilern sehr häufig unterstützt. Es ist sehr schwierig, einen Compiler zu finden, der diese Funktion nicht unterstützt und immer noch von seinem Hersteller unterstützt wird.

Bleiben Sie weg von sequence , wenn Sie C und Fortran mischen. Sequenztypen können gemäß dem Standard nicht interoperabel gemacht werden.

    
Vladimir F 30.11.2014 11:32
quelle
2

Es gibt keine 100% saubere Lösung, die ich kenne. Normalerweise erstelle ich zwei Header-Dateien namens pack_on.h und pack_off.h . So definieren Sie eine Struktur ohne Auffüllung:

%Vor%

Die Header-Dateien enthalten die Pragmas oder was immer benötigt wird, um Ihren Compiler zu erfüllen, d. h. so etwas wie:

%Vor%

Wie Sie bereits gesagt haben, ist, wenn das binäre Layout ein Problem ist, typischerweise die Endianz wichtig. Dies wird in der obigen Lösung nicht angesprochen.

Bitte beachten Sie, dass es auch keine gute Idee ist, im gesamten Code gepackte Strukturen zu verwenden. Das Padding, das vom Compiler hinzugefügt wird, wenn Sie diese gepackten Strukturen nicht erzwingen, ist für schnellen Speicherzugriff nützlich.

In vielen Anwendungen ist es am besten, diese gepackten Strukturen nur in einer Schicht Ihrer Anwendung zu verwenden, die sich mit dem Lesen und Schreiben dieser gepackten Strukturen befasst, und kopieren Sie diese in richtig ausgerichtete Strukturen, bevor Sie sie in den Kern Ihrer Anwendung weiterleiten Verarbeitung.

    
netstat 30.11.2014 10:11
quelle

Tags und Links