Struct und Array
-
Folgendes:
//A float fa[5];
//B struct{ float f1,f2,f3,f4,f5; } fs;
Haben beide Variablen fa und fs die gleiche structur im speicher?
also quasie 20 aufeinander folgende bytes??
-
Normalerweise ja.
(Gegenfrage: Wofür ist das eigentlich interessant?)
-
BorisDieKlinge schrieb:
Haben beide Variablen fa und fs die gleiche structur im speicher?
ich glaube, bei der struct könnten seltsame lücken drin sein, beim array sind die abstände immer gleich. bitte berichtigt mich.
-
-
es geht darum , variablen in aus roh daten zu lesen. Die wohdaten bestehen so aus hintereinanderhängede Bytes, wenn die rohdante bspq. 5 float werte sind kann ich dise so lesen:
//funktion die liest dummy(BYTE* rawdata,int Size){...}; struct DATA{ float f1,f2,f3,f4,f5; } fs; dummy((BYTE*)&fs,sizeof(DATA));
das gleiche geht auch mit einem array..
nun frag ich mich ob ich das richtig sehe?
-
BorisDieKlinge schrieb:
nun frag ich mich ob ich das richtig sehe?
das geht, aber nicht immer. Siehe meinen letzten Beitrag.
-
BorisDieKlinge schrieb:
das gleiche geht auch mit einem array..
nimm ein array. das ist sicherer.
-
ein array ist aber nich möglich, da bspw. auch unterschiedliche typen in den rohdaten mit drin sind, welche utnschieliche byte längen haben:) wie könnte ich das elegant lösen?
-
ein array ist aber nich möglich, da bspw. auch unterschiedliche typen in den rohdaten mit drin sind, welche utnschieliche byte längen haben:) wie könnte ich das elegant lösen?
-
entweder die daten einzeln auslesen und in variablen kopieren oder (allerdings fricklig) mit einen struct-pointer darauf zugreifen. die struct muss aber unbedingt als 'attribute packed' oder mit '#pragma pack(1)' definiert sein.
-
ich würde ganz elegant die länge in byte in der struktur speichern
-
das heist ohne "#pragma pack(1)" ist nicht gewährlieste, da die bytes ohne lückenhinter einander liegen??
Ich habe jetzt folgendes Gemacht:
struct LANE{ WORD wGood; WORD wMissed; WORD wBroken; WORD wOverlap; DWORD wRes1; DWORD wRes2; float fRateMissed; float fRatebroken; float fRateOverlap; } sLaneData[16];
Die Rohbyte daten haben eine länge von 448 bytes, welche sich aus 16 mal 28 byte blocken (struct) zusammensetzen.
wenn ich nun lese
dummy((unsigned char*) sLaneData,sizeof(sLaneData));
steht auch das richtige drin.. für was brauch ich denn hier nun "#pragma pack(1)" wenn es so funktionierT?
-
BorisDieKlinge schrieb:
das heist ohne "#pragma pack(1)" ist nicht gewährlieste, da die bytes ohne lückenhinter einander liegen??
Richtig - ohne Packing-Einstellungen kann der Compiler Füll-Bytes einschieben, um die einzelnen Elemente an passenden Speicheradressen auszurichten. In deinem Fall hast du vermutlich Glück, weil die Ausrichtung aller Elemente glatt aufgeht, in anderen Fällen hättest du da schon Probleme.
Nehmen wir mal ein Anwendungsbeispiel:
struct BITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; };
Das zweite Element ist ein DWORD (also 4 Byte groß) und sollte optimalerweise an einer durch 4 teilbaren Adresse beginnen. Da davor aber nur ein 2 Byte großes Element steht, würde der Compiler hier 2 Füll-Bytes dazwischen schieben, wenn du ihm das nicht verbietest.