Frage zu const



  • Du hast vor, C++ zu lernen.
    Du hast sogar vor 2 Monaten einen Thread namens "Neustart C++" aufgemacht.
    Du hast noch immer nicht begriffen, dass du gar kein C++ machst, sondern C. 🙄

    Geh mal ein paar Minuten in dich, und frage dich, welche Programmiersprache willst du nun eigentlich lernen.



  • Gugelmoser schrieb:

    Du hast vor, C++ zu lernen.
    Du hast sogar vor 2 Monaten einen Thread namens "Neustart C++" aufgemacht.
    Du hast noch immer nicht begriffen, dass du gar kein C++ machst, sondern C. 🙄

    Geh mal ein paar Minuten in dich, und frage dich, welche Programmiersprache willst du nun eigentlich lernen.

    Erstmal danke Euch Beiden fuer die 'freundliche' Antwort. Nun verstehe ich die Welt nicht mehr, wieso hier so negativ reagiert wird (vermutlich liegt das am vergangenen, etwas angespannten thread, keine Ahnung, ist ja auch egal).
    Ja, ich hatte diese Thread aufgemacht. Weil ich das Stroustrup Buch begonnen hatte. Da mir das aber zu streng war, bin ich auf 'Thinking in C++', Bruce Eckel, umgestiegen und finde das zum Lernen optimal (soviel zur Aussage 'kauf Dir ein gutes Buch'). Das Programmbeispiel stammt aus diesem Buch. Und da geht es genau darum, wie eine C-Loesung aussieht und was daran schlecht ist. Weiter hinten wird dann die C++ Loesung vorgestellt. Ausserdem ist das Schluesselwort 'new' ein C++ Schluesselwort, aber davon mal abgesehen.
    Von daher; ich weiss sehr wohl was ich 'code'. Und ich weiss sehr wohl, dass ich C++ lerne. Ich hatte nur Probleme mit diesem const Schluesselwort, das ist auch bisher in dem Zusammenhang nirgends erklaert worden. Und da dachte ich, man koennte hier sowas fragen. Aber wenn diese Fragen zu niedrig sind, was 'darf' man dann fuer Fragen stellen? Ich will hier nicht den Beleidigten spielen. Aber dass Ihr mich aufgrund einer einzelnen Frage als kompletten Bloedmann hinstellt, ist echt der Hammer!!!



  • Weißt du nicht was const ist? Das const in

    const void*
    ///oder
    void const*
    

    "sagt", dass der Pointee des Pointers nicht verändert werden darf. Für sowas kann man dann const_cast verwenden.

    Ich war so sauer, weil const etwas ist das man googlen kann, und nichts so komplex zu verstehendes.
    Ich nehme also an, du hast Teile des Buches übersprungen.



  • wollewausfander schrieb:

    Erstmal danke Euch Beiden fuer die 'freundliche' Antwort. Nun verstehe ich die Welt nicht mehr, wieso hier so negativ reagiert wird (vermutlich liegt das am vergangenen, etwas angespannten thread, keine Ahnung, ist ja auch egal).

    Das hast du jetzt aber auch falsch aufgefasst. Das war kein böser Beitrag, sondern eine Hilfe für dich, dass du (hoffentlich) erkennst, dass du beim Lernen etwas falsch machst, und es dir auf die Zukunft gesehen nur Schwierigkeiten bringen wird.

    wollewausfander schrieb:

    Ja, ich hatte diese Thread aufgemacht. Weil ich das Stroustrup Buch begonnen hatte. Da mir das aber zu streng war, bin ich auf 'Thinking in C++', Bruce Eckel, umgestiegen und finde das zum Lernen optimal (soviel zur Aussage 'kauf Dir ein gutes Buch'). Das Programmbeispiel stammt aus diesem Buch.

    Ok, die Bücher sind auf jeden Fall in Ordnung. Ja da hast du Recht, das Stroustrup Buch ist für den Anfang wirklich zu hart.

    wollewausfander schrieb:

    Und da geht es genau darum, wie eine C-Loesung aussieht und was daran schlecht ist.

    Das hättest du vielleicht in deinem Eingangspost erwähnen sollen. Dann wäre auch klar gewesen, dass du dir nur ein C-Beispiel anschaust und nicht C programmierst.

    wollewausfander schrieb:

    Ausserdem ist das Schluesselwort 'new' ein C++ Schluesselwort, aber davon mal abgesehen.

    Das stimmt zwar. Dennoch wird es in der Praxis selten verwendet, weil es zu schnell Fehler mit sich bringt.

    wollewausfander schrieb:

    Ich hatte nur Probleme mit diesem const Schluesselwort, das ist auch bisher in dem Zusammenhang nirgends erklaert worden.

    Wieso da const steht, macht jetzt für mich gerade auch keinen Sinn. Das const ist für mich überflüssig, weil es der nachfolgende Cast nicht beachtet.

    wollewausfander schrieb:

    Und da dachte ich, man koennte hier sowas fragen. Aber wenn diese Fragen zu niedrig sind, was 'darf' man dann fuer Fragen stellen?

    Du darfst natürlich alles Fragen. Es geht nur darum: Wenn dein Programmbeispiel C ist, dass es ins C-Unterforum gehört.

    wollewausfander schrieb:

    Ich will hier nicht den Beleidigten spielen. Aber dass Ihr mich aufgrund einer einzelnen Frage als kompletten Bloedmann hinstellt, ist echt der Hammer!!!

    Das war bestimmt nicht unsere Absicht.



  • @Hacker, @Gugelmoser,
    danke fuer Eure Beitraege. Wie ich schon schrieb, spiele ich nicht den Beleidigten (auch wenn mein letzter Satz das dummerweise hat so aussehen lassen), ich mag es nur nicht, wenn behauptet wird, ich wuesste nicht, was ich tue. Denn m.M. war die Frage serioes gestellt und ich hatte genau nach Forenregeln den wesentlichen Teil des Programms dargestellt, nicht mehr und nicht weniger (vielleicht haette ich #include <iostream> noch mit rein nehmen sollen, um zu zeigen, dass ich im richtigen Forum bin).
    Was const ist, ist mir schon klar. Und dass man danach googlen kann, ist auch klar. Was aber beim googeln nicht erklaert wird, ist (gerade in Beziehung zu const_cast, wonach ich kuerzlich noch fragte und dachte, es verstanden zu haben) folgendes:

    Hier ist element ein Pointer auf einen konstanten Pointerinhalt.

    int add(CStash* s, const void* element)
    

    Aber hier wird element doch quasi wieder nonconst benutzt, was doch eigentlich nur mit const_cast funktioniert?

    unsigned char* e = (unsigned char*)element
    

    Oder ist das egal, weil element quasi nur 'readonly' benutzt wird? Das ist mein eigentliches Verstaendnisproblem und ich finde, das kann man nur direkt fragen, so explizit laesst sich das beim googeln wohl nicht finden.

    Edit:
    @Hacker: Ich ueberspringe nie Teile eines Buches, das macht keinen Sinn. Vielmehr halte ich mich hier und da mit Kleinigkeiten auf, die ich nicht gleich verstehe. Das ist dann der Moment, wo ich hier nachfrage.



  • wollewausfander schrieb:

    int add(CStash* s, const void* element)
    

    Aber hier wird element doch quasi wieder nonconst benutzt, was doch eigentlich nur mit const_cast funktioniert?

    Wie du gesagt hast, ist das ein C-Beispiel. In C gibt es keinen const_cast . In C gibt es nur (Typ)Objekt . Was hinter den Kulissen eines C-Casts passiert, kann alles mögliche sein, z.B. ein const-Cast + reinterpret-Cast (*wie in deinem Fall). Weil das böse ist, hat man sich entschlossen, in C++ 4 Cast-Operatoren einzuführen, die eine anschauliche Syntax mit Aussagekraft und Typsicherheit bieten.

    wollewausfander schrieb:

    Oder ist das egal, weil element quasi nur 'readonly' benutzt wird?

    Genau. Weil du nur lesend darauf zugreifst, hauts dir das Ding auch nicht um die Ohren. Angenommen du würdest einen const int in die add-Funktion geben und dann schreibend darauf zugreifen, stürzt dir dein Programm früher oder später ab. Fazit: Wenn du auf etwas nur lesend zugreifst, machst du es const .

    const int i = 8;
    const void* cvp = &i;
    
    void* vp = const_cast<void*>(cvp);
    unsigned char* ucp = reinterpret_cast<unsigned char*>(vp);
    


  • Gugelmoser schrieb:

    Weil das böse ist, hat man sich entschlossen, in C++ 4 Cast-Operatoren einzuführen, die eine anschauliche Syntax mit Aussagekraft und Typsicherheit bieten.

    Vielen Dank fuer die Erklaerungen! Auch fuer die Darstellung, was intern wirklich passiert, sehr informativ! Trotzdem noch eine Sache, die dazu im Widerspruch(?) steht; da im kompletten Programm Konstrukte wie 'cout' (und auch new) usw. vorkommen, muss das 'C-Beispiel' mit einem C++ compiler (bei mir g++) compiliert werden. Muessten da dann nicht explizit const_cast und reinterpret_cast angegeben sein, damit der compiler keine Warnungen ausgibt? Ok, ich habe das allerdings komplett ohne Optionen compiliert. Ggf. muss ich mal in der manpage zu g++ nachsehen, wie man Warnungen generieren kann. Aber dann muessten auch diese Warnungen auftauchen, nicht wahr?



  • wollewausfander schrieb:

    Aber dann muessten auch diese Warnungen auftauchen, nicht wahr?

    Was für eine Warnung meinst du denn? Du bekommst beim Casten normal nie eine Warnung. Weil casten bedeutet ja, dass DU die Verantwortung übernimmst. Also praktisch: "Lieber Compiler, mach das bitte so, ich weiß schon was ich tue."

    Warnungen anzuschalten ist eine gute Idee. Du solltest auf jeden Fall beim Kompilieren folgendes mit übergeben: -Wall -Wextra -pedantic



  • Gugelmoser schrieb:

    Was für eine Warnung meinst du denn?

    Keine Explizite. Ich 'dachte' nur, dass die von Dir angesprochene Typsicherheit mittels explizitem const_cast/reinterpret_cast hier aufgrund dieser fehlenden Angabe eine Warnung ausgeben wuerde, was sich aber ja hiermit

    Gugelmoser schrieb:

    Du bekommst beim Casten normal nie eine Warnung. Weil casten bedeutet ja, dass DU die Verantwortung übernimmst. Also praktisch: "Lieber Compiler, mach das bitte so, ich weiß schon was ich tue."

    geklaert hat. Es kommt naemlich auch keinerei Warnung.

    Gugelmoser schrieb:

    Warnungen anzuschalten ist eine gute Idee. Du solltest auf jeden Fall beim Kompilieren folgendes mit übergeben: -Wall -Wextra -pedantic

    Ok, danke dafuer.



  • Merke dir nur für die Zukunft: Niemals C und C++ mischen.



  • Hacker schrieb:

    Merke dir nur für die Zukunft: Niemals C und C++ mischen.

    Und das ist manchmal gar nicht so einfach, da die Grenzen hier m.M. nach schwimmend sind (es heisst ja, C++ sei eine Obermenge von C). Aber genau da setzt das Buch 'Thinking in C++' ja an. Es erklaert nicht nur stur die Syntax, sondern weist gut auf solche Pitfalls hin und stellt die entspr. Vergleiche an. Obwohl ich nichtmal halb durch bin, habe ich mir schon 'Volume Two, Practical Programming' zugelegt, weil ich jetzt schon weiss, dass das mein naechstes Leseprojekt gibt.
    Dazu gerade mal vorab eine Frage; es gibt da einen Abschnitt 'Concurrency Programming' (natuerlich gehe ich an diese Themen erst zu gegebener Zeit ran, aber von Java kenne ich diese Mechanismen schon). Dort wird die 'ZThread' Library fuer die Threadfunktionalitaet eingesetzt. Das Buch ist aus 2004. Gibt es da mittlerweile bessere Bibliotheken, oder ist das mittlerweile gar Inhalt der Standard Bibliothek?



  • wollewausfander schrieb:

    Hacker schrieb:

    Merke dir nur für die Zukunft: Niemals C und C++ mischen.

    Und das ist manchmal gar nicht so einfach, da die Grenzen hier m.M. nach schwimmend sind (es heisst ja, C++ sei eine Obermenge von C).

    Mit einem guten Buch, wie z.B. dem Primer, ist es nicht möglich, fälschlicherweise C anstatt C++ zu lernen, da dort nur C++ gelehrt wird.

    Bestimmte Sachen, wie z.B. int a=0; oder if...else..,etc sind sowohl als C wie auch als C++ definiert.


Anmelden zum Antworten