Problem mit struct (Bit Fields)
lima-city → Forum → Programmiersprachen → C/C++ und D
ausgeben
bit
code
compiler
entsprechende warnungen
forum
header
kernproblem
kleiner nachtrag
kleinerer fehler
maximalwert
problem
sonstige programmiersprachen
stehen
syntax
tun
typ
vorliegen
zeile
zuweisung
-
Hallo.
Erst einmal ein bisschen Quelltext, der für mein Problem relevant ist:
Code:
struct SPackageHeader {
unsigned short isPackageHeader : 1,
payloadSize : 11,
channel : 4;
};
Code:
SPackageHeader header;
header.isPackageHeader = 1;
header.payloadSize = 2048;
header.channel = 0;
Sofort nachdem dieser Quelltext abgearbeitet ist, ermittele ich per Debugger, dass der Wert von header.payloadSize \"0\" ist.
Was mache ich falsch? Habe ich etwas falsch verstanden bei Bit Fields?^^
Mfg -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich vermute, dass du nen Overflow vorliegen hast. Also, payloadSize ist 11 Bit lang, d.h. es können 2048 verschiedene Werte gespeichert werden. Der Wert 0 gehört nun aber auch dazu. Deswegen wird der Wert bei 2048, welches um 1 größer ist, als der Maximalwert 2047, wieder auf 0 gesetzt.
EDIT:
Ahja, kleiner Nachtrag. Da es sich ziemlich eindeutig um C/C++ Syntax handelt, gehört das hier wohl auch ins entsprechende Forum.
Beitrag geändert: 11.3.2008 19:35:03 von xenodez -
Ich gehe mal davon aus dass du tatsächlich C meinst, deshalb verschoben nach C/C++.
Gerade im Forum \"Sonstige Programmiersprachen\" bitte immer die Sprache mit hinschreiben ;)
So, also ein kleinerer Fehler der mir aufgefallen ist, ist erstmal dass in der Zeile
SPackageHeader header;
natürlich
struct SPackageHeader header;
stehen muss (zumindest in C), da der Typ eines Struct nach ANSI C nicht autoamtisch bekannt gemacht wird. Zumindest der GCC kompiliert\'s sonst auch nicht. Hat aber mit deinem Problem nichts zu tun.
Das Kernproblem ist aber der von xenodez angesprochene Überlauf. Ein ordentlicher Comiler sollte bei der Zuweisung header.payloadSize = 2048; auch zumindest eine Warnung ausgeben, dass die Konstante größer ist als der Speicherbereich der Variablen (gcc: \"Große Ganzzahl implizit auf vorzeichenlosen Typen abgeschnitten\"). Überprüfe mal, ob du entsprechende Warnungen evtl. deaktiviert hast. Wenn nicht, scheint der Compiler nicht sonderlich benutzerfreundlich zu sein ^^
MfG,
thw -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage