Daten in einer Struktur

Gast #4870629
1
#define NAMENSLAENGE 20
2
#define DATUM 6
3

4
typedef struct
5
{                        
6
 uint16_t  Nummer;
7
 char    Name  [NAMENSLAENGE];
8
 uint8_t  Tag  [DATUM];
9
 float          Wert;
10
 uint16_t   CRC;
11
} MeineStruktur;
12

13

14
MeineStruktur Struktur1 =
15
{
16
10,
17
"HansMüller"
18
{1,1,1,1,1,1},
19
1.2,
20
33
21
};


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?
1
MeineKopierFunktion(uint8_t *data, uint32_t Laenge)
2
{mach was}
3

4

5

6
Aufruf:
7
MeineKopierFunktion(uint8_t*)&Struktur1 , Laengenangabe);
Gast
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.
Gast
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...
Gast
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).

Antwort schreiben

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.