C++ Problem mit Pointer
Hallo zusammen,
C++ ist lange bei mir her - die Pointer ebenfalls.
Dennoch versuche ich mich gerade wieder einzuarbeiten und stoße auf folgendes Problem:
Läuft soweit.
Erweitert um:
läuft es nicht mehr!
Was mache ich in der letzten Zeile falsch?
C++ ist lange bei mir her - die Pointer ebenfalls.
Dennoch versuche ich mich gerade wieder einzuarbeiten und stoße auf folgendes Problem:
typedef union union_bitfeld
{
unsigned char value;
struct bitfeld_4
{
unsigned int bit00 : 1;
unsigned int bit01 : 1;
unsigned int bit02 : 1;
unsigned int bit03 : 1;
} bitfeld;
} ubf4;
ubf4 test;
test.value = 123;
printf("%d" ,test.value);
Erweitert um:
ubf4 *pTest;
pTest= &test;
printf("%d" ,*pTest.value);
Was mache ich in der letzten Zeile falsch?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 244221
Url: https://administrator.de/contentid/244221
Ausgedruckt am: 21.11.2024 um 16:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo Maik87,
es besteht ein Ungleichgewicht in deiner union zwischen
Du kannst aber durchaus mit bitweisen Operatoren arbeiten. In diesem Fall Shift Right (>>) und Bitweises Und (&).
Grüße
rubberman
es besteht ein Ungleichgewicht in deiner union zwischen
value
(8 Bit breit) und struct bitfeld_4
(4 Bit breit oder auch nicht, siehe übernächsten Satz). Das heißt, ein Wert von 123 in value lässt sich nicht mehr in deinem struct abbilden (bei 15 ist Schluss). Darüber hinaus erzeugen Bitfelder in einer union laut Standard undefiniertes Verhalten. Anders gesagt, unter Windows scheint es zu funktionieren (weil die Implementierung es zulässt), auf anderen Betriebssystemen kann das ganz anders aussehen und du darfst dich nicht darauf verlassen, dass Microsoft diese Implementierung nicht irgendwann ändert.Ist es nun noch möglich, die einzelnen bitxx mit einer Schleife zu durchlaufen?
Nein. Die Kurzerklärung: Nach dem Compilieren gibt es keine Variablennamen mehr.Du kannst aber durchaus mit bitweisen Operatoren arbeiten. In diesem Fall Shift Right (>>) und Bitweises Und (&).
#include <stdio.h>
typedef union union_bitfeld
{
unsigned char value;
struct bitfeld_4
{
unsigned int bit00 : 1;
unsigned int bit01 : 1;
unsigned int bit02 : 1;
unsigned int bit03 : 1;
} bitfeld;
} ubf4;
int main()
{
ubf4 test = {0};
ubf4 *pTest = NULL;
int i = 0;
test.value = 7;
pTest = &test;
printf("%u\n", test.value);
printf("%u\n\n", pTest->value);
printf("%u\n", pTest->bitfeld.bit00);
printf("%u\n", pTest->bitfeld.bit01);
printf("%u\n", pTest->bitfeld.bit02);
printf("%u\n\n", pTest->bitfeld.bit03);
for (i = 0; i < 4; ++i)
printf("%u\n", pTest->value >> i & 1);
return 0;
}
Grüße
rubberman
Ohje - das schon wieder. Genau damit habe ich gestern paar graue Haare hinzubekommen.
Oooch, kein Grund für graue Haare.Bitweise Operationen sind relativ einfach. Voraussetzung ist, dass du dir die Zahlenwerte tatsächlich in ihrer binären Entsprechung vorstellst oder aufschreibst.
Nehmen wir mal mein Beispiel 7 und an der Stelle auch nur die niedrigsten 4 Bit (mehr interessiert dich ja eh nicht). Die binäre Entsprechung wäre 0111. Das rechte Bit ist das niedrigste Bit und immer 2^0. Je nach Bitbreite des verwendeten Typs, folgen dann 2^1, 2^2 etc.
Binär, schnell erklärt:
exponentiell 2^3 | 2^2 | 2^1 | 2^0
dezimal 8 | 4 | 2 | 1
x | x | x | x
7 binär 0 | 1 | 1 | 1
___________________
Produkt 0 | 4 | 2 | 1
Das Binary And hat folgende Regeln:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Beispiel 7 & 1
7 0 | 1 | 1 | 1
& & | & | & | &
1 0 | 0 | 0 | 1
_ ___________________
1 0 | 0 | 0 | 1
Für die restlichen Bits nehmen wir das Shift Right. Dabei werden die Bits eine bestimmte Anzahl nach rechts verschoben. Die selbe Anzahl Nullen wird vorangestellt und die überflüssigen Bits rechts entfernt.
Die Schleife mal durchgespielt, sieht das so aus:
7 0 | 1 | 1 | 1 >> 0
__ ___________________
7 0 | 1 | 1 | 1
& & | & | & | &
1 0 | 0 | 0 | 1
__ ___________________
1 0 | 0 | 0 | 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7 0 | 1 | 1 | 1 >> 1
__ ___________________
3 0 | 0 | 1 | 1 [ 1 ]
& & | & | & | &
1 0 | 0 | 0 | 1
__ ___________________
1 0 | 0 | 0 | 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7 0 | 1 | 1 | 1 >> 2
__ ___________________
1 0 | 0 | 0 | 1 [ 1 | 1 ]
& & | & | & | &
1 0 | 0 | 0 | 1
__ ___________________
1 0 | 0 | 0 | 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7 0 | 1 | 1 | 1 >> 3
__ ___________________
0 0 | 0 | 0 | 0 [ 1 | 1 | 1 ]
& & | & | & | &
1 0 | 0 | 0 | 1
__ ___________________
0 0 | 0 | 0 | 0
Gar nicht mal sooo kompliziert, oder?
PS:
Worin unterscheidet sich
#include <stdio.h> und #include <stdio>?
Öhm, hauptsächlich darin, dass es <stdio> nicht gibt. Meinst du <cstdio> ?Worin unterscheidet sich
#include <stdio.h> und #include <stdio>?
Also, der Code den du oben geschrieben hast, ist eigentlich C und nicht C++. Da C aber aus Kompatibilitätsgründen fast vollständig in C++ aufgeht, wurden auch die entsprechenden Funktionen in den C++ Standard übernommen. Nun sollen diese unter C++ aber auch im Standard-Namespace (namespace std) landen. Damit das passiert, includiert man in C++ nicht die C-Header (bspw. stdio.h) sondern deren C++ Entsprechungen (bspw. cstdio). Im selben Stil stdlib.h zu cstdlib etc...
Heißt aber ausdrücklich nicht dass man beliebig C-Code in C++ verwendet. Das ist schlechter Stil und wie gesagt vorrangig aus Kompatibilitätsgründen überhaupt möglich.
Grüße
rubberman