Hallo,
liegen die Daten in dieser Struktur wirklich komplett hintereinander weg
im Speicherbereich oder können die aus irgendwelchen Gründen verteilt
auftreten?
Funktioniert der Aufruf unten?
Struktur schrieb:> oder können die aus irgendwelchen Gründen verteilt auftreten?
Sie liegen schon hintereinander, aber je nach Zielplattform können
Stuffbytes eingefügt sein, um das Alignment auf 16 oder 32 Bit zu
korrigieren.
Der C Compiler hat die Freiheit, Füllbytes einzufügen. Bei vielen
Prozessoren kann er so due Performance verbessern. Bei manchen
Prozessoren ist es sogar zwingen nötig.
Stefan U. schrieb:> Der C Compiler hat die Freiheit, Füllbytes einzufügen.
Es ist zwar "Implementation defined", aber freiheit hat ein Compiler
nicht wirklich, da er sich i.d.R. an eine EABI hält, die solche Dinge
festlegt.
wie nutze ich dieses Attribute?
Magst du mir einen Beispielode geben?
Ich möchte bzw. muss die Struktur Bytewese an eine andere Funktion
übergeben und möchte da natürlich genau die gleiche Reihenfolge
wiederfinden wie in meiner ursprüngichen Struktur.
Beim Debuggen kommen im Moment am Anfang die Daten richtig an, dann
irgendwann nicht mehr. Ich habe keine Ahnung warum und daher die Frage
oben...
Struktur schrieb:> Ich möchte bzw. muss die Struktur Bytewese an eine andere Funktion> übergeben und möchte da natürlich genau die gleiche Reihenfolge
warum musst du das überhaupt?
So etwas ist oft eine schlechte Idee.
Tausend DANK!
Funktioniert mit der pragma directive.
Eine Frage:
Woher weiß man das?
Ich brauche wikrlich dringend ein C Buch, das diese ganzen Dinge, die
man einfach wissen muss behandelt. So etwas kommt irgendwie immer zu
kurz.
Struktur schrieb:> Ich möchte bzw. muss die Struktur Bytewese an eine andere Funktion> übergeben und möchte da natürlich genau die gleiche Reihenfolge> wiederfinden wie in meiner ursprüngichen Struktur.
Wenn das mit denselben Compilereinstellungen compiliert wurde, spielen
die Füllbytes keine Rolle
Ja also die ganze Vorgehensweise ist schon falsch. Wann braucht man das
überhaupt? Bei Embedded meist wenn man Daten physikalisch woanders hin
haben will, sei es in einen Flash-Speicher schreiben oder über eine
Schnittstelle senden. Dann kann man ein Struct nehmen und in einen void
Pointer stopfen und das wird dann übertragen. Hier möchte man keine
Lücken, weil man sonst am anderen Ende die Daten nicht mehr so leicht
zusammenbauen kann.
Aber innerhalb eines Programmes, innerhalb des RAMs so einen Stunt zu
machen ist meist unnötig. Entweder man greift direkt über die Feldnamen
zu, oder man kopiert in diesselbe Struktur an einer anderen
Speicherstelle. In beiden Fällen ist es egal wie die Daten gepackt sind.
Mich würde die konkrete Anwendung interessieren.
Struktur schrieb:> Es handelt sich tatsächlich um die Übertragung in einen Flashspeicher> und genau da sind mir mittendrin Daten verloren gegangen.
Sagen wir mal so. Wenn die Daten übertragen und irgendwann wieder in
diese Struktur zurückgelesen werden, dann dürfte es auch kein Problem
geben. Erst wenn du die Daten mit einem anderen Programm verarbeiten
willst, sollten dir die Lücken auffallen.
Das Problem tritt regelmäßig auf, wenn man eine Datenstruktur in einem
binären Datenstrom bspw. über ein Netzwerk auf eine andere Maschine
übertragen will. Die andere Maschine verwendet i.A. nicht nur ein
anderes Alignment (und damit ein anderes padding zwischen den
Datenelementen des struct), sondern hat ggf. andere Größen der
primitiven DT und ggf. eine andere Endianess.
Deswegen benutzt man eine solche binäre Serialisierung ungern. Entweder
verwendet man ein sog. External Data Representation wir XDR oder
verpackt alles als ASCII bspw. in XML.
Innerhalb eines Systems ist das natürlich kein Problem (sofern man mit
dem "Verschwenden" des Speichers leben kann).
Eine eigene Frage?
Dieser Thread ist über 9 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.