const Array mit Variablen initialisieren



  • Paul Müller schrieb:

    "const float coeffs[]". (Soll heißen, er will einen Zeiger auf ein konstantes Array

    Nein das heißt es wird ein Array übergeben, welches du in der Funktion nicht verändern darfst. Eigentlich wird auch nur ein Zeiger auf ein Array übergeben. Und diesen kannst du sogar verändern, nur die Werte hinter dem Zeiger nicht. Deswegen finde ich diese Verwendung von const auch sehr naiv.

    Warum? Dem Aufrufer wird garantiert, dass (aus seiner Sicht) nichts geändert wird, was er der Funktion übergibt. Was ist daran naiv?



  • Oder aber die Merkregel ist Schrott?

    Ja, okay du hast Recht.

    Ich hasse es, wie in diesem Forum all meine Falschaussagen auseinandergenommen werden... Vielleicht sollte ich mir einen neuen Nick suchen. Unter diesem hier nimmt mich ja sowieso keiner mehr ernst.


  • Mod

    Paul Müller schrieb:

    Ich hasse es, wie in diesem Forum all meine Falschaussagen auseinandergenommen werden...

    Das ist nichts persönliches, es liegt eher an dem "Falsch" in den Aussagen. Man ist hier eben sehr penibel.



  • Das war nicht ich, das hat jemand anderes geschrieben. 😡
    Vielleicht sollte ich mich mal registrieren.



  • Paul Müller schrieb:

    Das war nicht ich, das hat jemand anderes geschrieben. 😡
    Vielleicht sollte ich mich mal registrieren.

    Ist schon interessant, dass du weißt, dass das jemand anderes geschrieben hat? Könnte das vielleicht daran liegen, dass du der Nickdieb bist und den Beitrag doch geschrieben hast? Es ist eigentlich Schade, dass es Leute gibt, die hier das Niveau des Golem-Forum einführen möchten. Als ob es nicht schon genügend Spielwiesen für sinnlose Trollerei im Internet gäbe. Ich werde mich hier wohl dann zurück ziehen müssen, weil ich mich lächerlich mache. Aber mache ich mich den wirklich lächerlich, wenn hier ein Troll in meinem Namen postet? Wer weiß, ob nicht du der bist, der die falschen Aussagen streut? Ich finde es Schade, weil ich sicher den einen oder anderen helfen konnte, so hoffe ich. Und btw der echte Paul Müller hat nichts dagegen das seine falschen Aussagen korrigiert werden. Deswegen schreibt man ja auch mal dumme Dinge, damit man lernen kann, wie es richtig geht.
    Also tschüss Paul Müller, hallo Random-Nicks. Ist natürlich Mist für die, die gerne wissen möchten wer ihr Gegenüber ist.
    Der letzte ernst gemeinte Beitrag, ist der von 15:15. Wobei man an den beiden letzten Inhaltsleeren Posts auch erkennen kann, dass es sich um einen übereifrigen Troll handeln muss.
    Und nein ich registriere mich nicht deswegen, weil meine eigenen Fragen verschwindend gering waren und ich bei meinen Ansprechpartnern aus Fleisch und Blut keine Trolle befürchten muss.



  • Paul Müller schrieb:

    Aber mache ich mich den wirklich lächerlich, wenn hier ein Troll in meinem Namen postet?

    Ich wuesste nicht warum.
    Die Gefahr des Nick-Klau besteht eben wenn man sich nicht registriert. Sehe da aber kein Problem. Wenn du Leuten helfen willst, interessante Diskussionen fuehren und vielleicht auch etwas lernen - warum sollte da ein Name eine Rolle spielen?



  • Prinzipiell ist der Name egal. Nur zwei Personen mit dem selben Namen sind verwirrend.
    Aber um noch mal auf "meine Merkregel" zurück zu kommen. Mich würde dann doch stark interessieren, welche Fälle es noch gibt, außer diese Array-Deklaration?
    Mir ist es eigentlich auch wurscht was andere davon halten. Man sieht es nur recht selten, eigentlich nie, dass die anderen Teile des Datentypen konstant gemacht werden können, bzw bei Bedarf gemacht werden müssen. Statt dessen sieht man es umso häufiger, dass man ein const davor schreibt und hofft, dass sich die Sache damit erledigt hat.
    Und was die Sache mit der Lächerlichkeit betrifft. Wenns dich nicht interessiert, dann ignoriere es einfach. Wenns dich erheitert dann erfreu dich dran. Aber mit sinnlosem Nickklau, wirst du weder wissen, ob du mich ignorieren sollst, dich erheitern kannst oder etwas lernen kannst. Das ist eben das Los der sinnbefreiten Trollerei.





  • Ist so eine Merkregel überhaupt nötig/sinnvoll?

    Im Grunde genommen gibt es doch nur drei Variablentypen (weiß nicht wie ich die besser unterscheiden kann):
    1. "normale" Variablen, also z.B. int a; double b; MyClass c;
    2. Zeigervariablen, also z.B. const int* a; double * const b;
    3. Referenzen, also z.B. const int& a = 1; MyClass& b = MyClass()

    1. und 3. verhalten sich im Bezug auf const exakt gleich; man kann sich auch gar nicht vertun, weil es nur eine Semantik gibt.
    Bei 2. gibt es zwei Möglichkeiten, wobei man beide sehr leicht unterscheiden kann:

    • const vor dem Sternchen -> Zeiger zeigt auf konstantes Objekt
    • const nach dem Sternchen -> Zeiger selbst ist konstant

    Also wozu irgendwelche Merkregeln, wenn es doch beim entscheidenen Fall 2. (der einzige, bei dem man etwas falsch machen könnte) sowieso nur zwei Möglichkeiten gibt?



  • Wie siehts aus mit Zeigern auf Funktionen. Zeigern auf konstante Funktionen. Zeigern auf Zeigern. :p



  • Merkregel schrieb:

    2. Zeigervariablen, also z.B. const int* a; double * const b;

    Das Problem an dieser Unterscheidung ist aber, dass ein Zeiger auch eine normale Variable ist. Und dieser Zeiger kann konstant sein, aber auch das referenzierte Objekt kann konstant sein. Was ein Unterschied ist. Es gibt aber auch Zeiger, auf Zeiger. Und diese können auch eine Konstantheit aufweisen. Deswegen ist es wichtig zu wissen, auf was sich genau ein Schlüsselwort bezieht. Und das ist das was vor const steht. Ganz klar wird es bei Methoden. Dort kann ich auch bei void nicht const davor schreiben, auch wenn es offensichtlich ist, dass void nicht const sein kann. Einen anderen Grund, als diese Offensichtlichkeit kann ich mir zumindest nicht vorstellen, warum es überhaupt erlaubt ist diese Ausnahme bei Variablen zu schreiben.
    Und in die Parameterliste einer Funktion eine Array-Deklaration zu schreiben ist unschön, weil es kein Array ist, sondern ein Zeiger.
    Ein Array hat auch dieses Problem gar nicht, ob man nun den Zeiger (den es hier eigentlich nicht gibt) konstant deklarieren soll oder nicht, ein Array hat immer eine konstante Adresse.

    Merkregel schrieb:

    Also wozu irgendwelche Merkregeln, wenn es doch beim entscheidenen Fall 2. (der einzige, bei dem man etwas falsch machen könnte) sowieso nur zwei Möglichkeiten gibt?

    Weil zwei Möglichkeiten schon eine zuviel ist. Und die Merkregel auch nur in den Codeschnipsel gerutscht ist, weil ich den nicht extra geschrieben habe. Dass wollte ich gar nicht ansprechen.
    Es ist halt unschön, weil es unnötige Fragen aufwirft. Und gerade Anfänger haben so schon genug Fragen, die muss man nicht noch extra verwirren.



  • Merkregel schrieb:

    3. Referenzen, also z.B. const int& a = 1; MyClass& b = MyClass()

    Referenzen sind übrigens auch so ein Fall, wie bei den Arrays, wo eine const Deklaration gar nicht notwendig ist, weil sie implizit geschieht. Eine Referenz ist immer an ein Objekt gebunden und die Semantik lässt es auch gar nicht zu diese Bindung zu ändern.

    Btw, kann man von einem temporären Objekt keine Referenz bilden. Weil es im gleichen Augenblick wieder zerstört wird.



  • Paul Müller schrieb:

    Referenzen sind übrigens auch so ein Fall, wie bei den Arrays, wo eine const Deklaration gar nicht notwendig ist, weil sie implizit geschieht. Eine Referenz ist immer an ein Objekt gebunden und die Semantik lässt es auch gar nicht zu diese Bindung zu ändern.

    Das const bezieht sich doch auf das Objekt, auf das sich die Referenz bezieht, deshalb macht die Unterscheidung schon Sinn.



  • Ja, aber ein const hinter dem Und-Zeichen macht keinen Sinn, weil ich die Referenz nicht ändern kann.



  • Wie siehts aus mit Zeigern auf Funktionen. Zeigern auf konstante Funktionen. Zeigern auf Zeigern. :p

    Stimmt, die Funktionszeiger haben auch noch eine etwas eigentümliche Syntax.

    Es gibt aber auch Zeiger, auf Zeiger. Und diese können auch eine Konstantheit aufweisen. Deswegen ist es wichtig zu wissen, auf was sich genau ein Schlüsselwort bezieht.

    Ja, das stimmt. Trotzdem denke ich, dass das auch ohne die Regel, dass sich const immer auf das Vorrangegangene bezieht klar ist. Wie der Schatten meiner Selbst gesagt hat: Man ließt einfach von rechts nach links und schon ist wieder alles konsisten. Alles Ansichtssache.

    Referenzen sind übrigens auch so ein Fall, wie bei den Arrays, wo eine const Deklaration gar nicht notwendig ist

    Natürlich sind sie notwendig. Wie sonst soll ich dem Aufrufer klar machen, dass ich sein Objekt nicht verändere? Natürlich kann ich die Referenz nicht "umbiegen" (weswegen konstante Referenz eigentlich ein weißer Schimmel ist - richtig wäre: Referenz auf konstantes Objekt), aber das referenzierte Objekt kann ich sehr wohl verändern, falls es nicht durch ein const verhindert wird.

    Btw, kann man von einem temporären Objekt keine Referenz bilden. Weil es im gleichen Augenblick wieder zerstört wird.

    Kann man schon, aber es ist böse. War auch nur um den Beispielcode kurz zu halten.



  • Ja, aber ein const hinter dem Und-Zeichen macht keinen Sinn, weil ich die Referenz nicht ändern kann.

    Wusste bisher gar nicht, dass das überhaupt erlaubt ist...


Anmelden zum Antworten