Allegmeine Fragen zu C++



  • 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=44638

    Shade of mine hat an anderer Stelle zum Einstieg empfohlen

    Accerlerated C++
    C++ lernen und professionell anwenden

    volkard 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 = nein

    Die 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, 0

    jedes 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 == 0x8000

    somit 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 0x10

    wenn 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 sind

    Bei 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 0x10

    j=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::ON 😉

    ausserdem 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


Anmelden zum Antworten