Allegmeine Fragen zu C++
-
Hallo, ich programmiere jetzt seit 96 stunden und während dieser Zeit, stellen sich mir immer mehr Fragen.
Hier sind sie.
1. In manchen Quellcodes sehe ich solches:
#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.2. Wo genau ist der Unterschied:
*++p und ++*p | lvalue und rvalue vielleicht?
3. In Stroustrups Buch, wird wirklich nur minimal ( Kapitel 6, Seite 133 ) auf Bitweise logische Operationen eigegangen, kann mir bitte einer erklären was ich damit genau anstellen kann, oder ein Tutorial wo dieses gut erklärt wird?
C u und thx im voraus
-
FrageJetztImmer schrieb:
Hallo, ich programmiere jetzt seit 96 stunden
Vorsicht: Ab ungefähr 100 Stunden kann das Gehirn nicht mehr zwischen Traum und Realität unterscheiden. Leg dich am besten mal ein paar Stunden hin. Morgen stellst du dann ein paar vernünftigere Fragen
-
Nachdem du jetzt 96 Stunden überlebt hast kommt der große Schock!
Mit dem von dir gewählten excellenten Buch wirst du nicht glücklich. Es ist für Leute geschrieben die schon ziemlich fit sind in C++.
Zum Einstieg gibt es andere Bücher und hier ein paar gute Tutorials
Schau die mal diesen Thread an
http://www.c-plusplus.net/forum/viewtopic.php?t=44638Shade of mine hat an anderer Stelle zum Einstieg empfohlen
Accerlerated C++
C++ lernen und professionell anwendenvolkard hält viel von diesn Büchern
"effektiv c++ programmieren
"exceptional c++"Anregung an unsere Gurus Gebt doch mal eine Liste von Büchern raus mit denen ihr zufrieden seid und für wen sie geeignet sind, Falls es die schon gibt 'tschuldigung ich hab sie nicht gefunden.
-
Was hat das mit dem Buch immer zu tun?! Ihr argumentiert immer auf die gleiche Art und Weise, wo steht denn das ich Probleme beim verstehen von dem Buch habe? Ich stelle meines Erachtens recht ordentliche Fragen. Ich denke auch nicht das ihr wirklich alles aus dem Buch von Stroustrup verstanden habt und jetzt die ganz großen seid.
Wieso sagt mir keiner was genau zur Bitmanipulation oder wo der unterschied zwischen *++P und ++*P ist. Ist das so schwer? Was ein Pointer ist, weiss ich mitlerweile, ich will nur den Unterschied zwischen diesen beiden erfahren.
Wenn ihr selbst die Lösung nicht wisst, verschwendet ihr eure Zeit mit dummen Antworten wie: "Schlaf paar stunden oder: Das Buch ist zu schwer und so weiter."
-
Nebenbei, meine ich mit 96 Stunden nicht meinen Schlafentzug, woher kommen eigentlich immer eure komischen Vermutungen? Damit meine ich, dass ich seid 4 Tagen dieses Buch besitze und mir, um so mehr ich mich hineinarbeite, immer mehr Fragen aufkommen.
-
FrageJetztImmer schrieb:
Wieso sagt mir keiner was genau zur Bitmanipulation oder wo der unterschied zwischen *++P und ++*P ist.
Bitmanipulation: Du musst folgendes wissen:
& | 0 | 1 ---------- 0 | 0 | 0 ---------- 1 | 0 | 1 | | 0 | 1 ---------- 0 | 0 | 1 ---------- 1 | 1 | 1 ^ | 0 | 1 ---------- 0 | 0 | 1 ---------- 1 | 1 | 0
Demnach gilt (binär):
0101 & 1100 == 0100 0101 | 1100 == 1101 0101 ^ 1100 == 1001
*++P: zuerst wird P (der Zeiger) inkrementiert und dann dereferenziert
++*P: die Variable, auf die P zeigt, wird inkrementiert
-
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