Allegmeine Fragen zu C++
-
du stellst fragen, die in jedem guten anfänger buch behandelt werden.
doch der stroustrup ist kein anfänger buch. er geht davon aus, dass du schon c++ kannst.
-
Ich würde ihn sogar noch für Umsteiger aus einer vergleichbaren Sprache (z. B. Delphi) empfehlen... (OK, das hatte jetzt nichts mit dem Thema zu tun. Aber was habt ihr nur alle gegen den Struppi?
)
-
FrageJetztImmer schrieb:
#define FOOBAR 0x800
was genau verbirgt sich hinter dieser hexadezimalen Schreibweise? Ich weiss das man fuer lange Zahlen und so fort, oft die hexdezimale Schreibweise benutzt, weil sie doch viel kürzer ist. Ich kann mir ja diese 0x800 durch cout << (int)FOOBAR; in eine dezimal Zahl
umwandeln lassen.Binärfolgen werden oft für FLAGS gebraucht.
Z.B.: 0100 -- erste Ziffer: Struppi ist doof? - 0 = nein
-- zweite: Ich bin doof? - 1 = ja
-- dritte: Du bist doof? - 0 = nein
-- vierte: Wir alle sind doof? - 0 = neinDie kann man dann schön ODERn und zusammenfassen...
Und da sich 4 Binärziffern immer so schön zu einer HEX-Ziffer zusammenfassen lassen, sorgt das für Übersichtlichkeit...
-
Und wenn wir gerade dabei sind, sollten wir nicht vergessen zu erwähnen, daß man statt dieses defines vielleicht lieber Konstanten oder ein enum verwenden sollte, da so die Typprüfung erhalten bleibt.
MfG Jester
-
Die wird aufgefallen sein das eine short int d.h. 16 Bit Integer Zahl sich
immer in 4 hexDigits darstellen löst in dezimaler Schreibweise sind es bis zu 5 Stellen. Des weiteren kann man jeder Position in dieser Schreibweise ein Bit zuordnen.
0xabcd
a enthält die Bits 15,14,13,12
b enthält die Bits 11,10, 9, 8
c enthält die Bits 7, 6, 5, 4
d enthält die Bist 3, 2, 1, 0jedes Bit steht genau für eine 2´er Potenz
Bit 0 für 2^0 1 == 0x0001
Bit 7 für 2^7 128 == 0x0080
Bit 8 für 2^8 256 == 0x0100
Bit 15 für 2^15 32768 == 0x8000somit kann man in dieser Schreibweise sehr gut 16 Flags einarbeiten in dem man jedem Bit ein Flag zuordent.
#define ON 0x1
#define HIGH 0x2
#define TEST 0x4
#define NTST 0x10wenn ich jetzt schreibe j=ON | TEST | HIGH;
steht in hex Schreibweise j=0x7; in integer Schreibweise j=7;wenn ich jetzt schreibe j=ON | TEST | HIGH | NTST;
steht in hex Schreibweise j=0x17 in integer Schreibweise j=23; aus den 23 ist jetzt schwer erkennbar welch flags gesetzt sindBei einer unsigned short int habe ich 16 Flags
Bei einer unsigned long int habe ich 32 Flags bei den derzeitign 32 Bit Systemen.Und der Hinweis auf die Bücher ist ganz einfach.
Deine Fragen zeigen einen Wissenstand der eher zu einem Einstiegsbuch als zu einem Fortgeschrittenbuch passt. Deine Fragen werden in den guten Einsteigerbüchern erklärt, im "Struppi" nur kurz wenn überhaupt gestreift, das dieses Wissen dort vorausgesetzt wird.
-
PAD schrieb:
D
#define ON 0x1
#define HIGH 0x2
#define TEST 0x4
#define NTST 0x10j=ON | TEST | HIGH;
enum Status {ON = 1, HIGH=2, TEST=4, NTST = 16}; Status Stat = ON | TEST | HIGH;
ist doch viel hübscher...
-
Ob´s hübscher ist weis ich nicht, ist zumindest aber auch eine sinnvolle Lösung
-
PAD schrieb:
Ob´s hübscher ist weis ich nicht, ist zumindest aber auch eine sinnvolle Lösung
vorallem beim debuggen besser...
oder weisst du spaeter noch, was 0x2 bedeutet?
da ists IMHO besser wenn der debugger mir sagen kann, das ist Status::ONausserdem willst du vielleicht auch mal ne funktion setStatus() machen - da waere es praktisch wenn niemand 7 uebergeben koennte, sondern nur die werte ubergeben kann, die Status kennt (typsicherheit!).
ausserdem kann meine IDE mir anzeigen welchen typ etwas hat - denn ich also den typ von ON wissen will, sagt die IDE mir bei der enum version: Status::ON und bei der #define version #define ON 0x1
also ich finde die enum version schoener.
-
Danke, gute Argumente.
Man sollte auch mal über eine sinnvolle Namensgebung by enums diskutieren, haben da gerade Probleme, mit zufällig gleichen enum Namen bei unterschiedlichen Werten, was dann verständlicherweise zu Compilerfehlern führt.
#define sind eigentlich genauso betroffen davon.
-
ich stecke enums deshalb immer in einen namensraum.
-
Wir möchten enums in mehreren Dll´s nutzen
Diese enums gaben folgende Ststruktur
die ersten 100 sind für alle Dll´s gemeinsam, es können auch noch welche dazukommen, in jeder dll sind ab der Nummer DLLBASE=0x1000 diejenigen enums die es nur in dieser dll gibt.
gibts für dieses Konstruct eine Lösung