Daten in einer Struktur

Gast #4870629
Lesenswert?
• ▲
▼
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 #4870666
Lesenswert?
• ▲
▼
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 #4870685
Lesenswert?
• ▲
▼
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.
#4870738
Lesenswert?
• ▲
▼
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.
#4870796
Lesenswert?
• ▲
▼
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.
#4870861
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren