Allegmeine Fragen zu C++



  • 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