Speicheradressen von Pointer


  • Gesperrt

    @manni66
    Außer man will dort was reißen: https://www.ioccc.org/



  • @hustbaer sagte in Speicheradressen von Pointer:

    Und genau deswegen macht man eine Zeile pro Variable.

    Der Haupt-Lesefluss von C++-Code ist ohnehin von oben nach unten, da wird es der Lesbarkeit sicher alles andere als schaden, wenn in einer Zeile möglichst wenig und bevorzugt nur eine Sache passiert.



  • Man muss sich wohl immernoch selbst ein Bild darum machen. Ich mag das Zeug lieber in einer Zeile haben. Andere nicht. Das ist geschmackssache. Der ganze Rest über den wir uns streiten ist darüber wie der unerfahrenste deine brühe am besten schluckt.



  • @spiri sagte in Speicheradressen von Pointer:

    Ich mag das Zeug lieber in einer Zeile haben. Andere nicht. Das ist geschmackssache.

    Es ist natülich Geschmackssache, ob du es magst. Eine Variable je Zeile ist aber eine Fehlervermeidungsstrategie und das hat mit "gefallen" nichts zu tun.



  • @manni66 sagte in Speicheradressen von Pointer:

    Eine Variable je Zeile ist aber eine Fehlervermeidungsstrategie und das hat mit "gefallen" nichts zu tun.

    Wenn mans falsch macht, ja. Wenn man aber ein fundiertes Wissen im Bereich hat, sollte sowas nicht mehr vorkommen, sondern sich genau so einfach lesen lassen, wie Zeile für Zeile.

    Für mich gilt das Gleiche auch beispielsweise mit den Casts. C++-style casts gefallen mir einfach nicht, sie schränken zwar einen potenziellen Fehler ein, aber jemand der schon jahrelang damit arbeitet macht auch keine Fehler mehr beim casten. Aus dem Grund (und um mir eben das ganze getippe zu ersparen) benutzte ich in C++ Code nur C-Style-Casts. Ich weiß was ich tue und seit Jahren hab ich mir damit immernoch nicht ins Bein geschossen.

    Eine weitere Fehlervermeidungsstrategie wäre wohl noch ein gutes Grundlagenbuch durchzuarbeiten.... 🙂



  • @spiri sagte in Speicheradressen von Pointer:

    Wenn man aber ein fundiertes Wissen im Bereich hat, sollte sowas nicht mehr vorkommen, sondern sich genau so einfach lesen lassen, wie Zeile für Zeile.

    So ähnlich dachten die in Tschernobyl damals auch.

    aber jemand der schon jahrelang damit arbeitet macht auch keine Fehler mehr beim casten.

    Dir ist schon klar, dass man dem C-Cast alleine nicht immer ansehen kann, was er macht?

    Eine weitere Fehlervermeidungsstrategie wäre wohl noch ein gutes Grundlagenbuch durchzuarbeiten.... 🙂

    Ja, notwendig aber nicht hinreichend.



  • @manni66 sagte in Speicheradressen von Pointer:

    So ähnlich dachten die in Tschernobyl damals auch.

    Quatsch, die haben damals einfach leichtfertig das gemacht, was der Chef ihnen befohlen hat, dass die Lage kritisch aussah wussten die Wissenschaftler.

    @manni66 sagte in Speicheradressen von Pointer:

    Dir ist schon klar, dass man dem C-Cast alleine nicht immer ansehen kann, was er macht?

    Ja. Aber der gute Programmierer weiß halt was er tut.

    Unterm Hut machen die C++-Style-Casts das Gleiche: Einen C-Style Cast, nur eingeschränkt, weil man zwischen static, dynamic oder einfach reinterpretieren unterscheidet. Wenn du aber einfach genau weißt, wie es funktioniert, sprich, was erlaubt ist und was nicht, wird niemals etwas schief gehen. Und sparst dir einen Haufen Tipparbeiten (was mich daran immer am meisten störte).

    Anders sieht das vielleicht aus bei Up-Casts, wo man aus einer Reihe von Basis-Objekten herausfinden möchte, ob die Instanz Typ einer vererbten Klasse ist. Und auch das mieft schon etwas nach Designfehler, kann man aber machen.

    @manni66 sagte in Speicheradressen von Pointer:

    Ja, notwendig aber nicht hinreichend.

    Wenn das Grundlagenbuch gut ist und du alles verstanden hast, dann doch, ist das hinreichend.


  • Mod

    Klingt schon ein bisschen nach "Ich fahr' immer ohne Gurt und bisher ist mir nichts passiert, ich bin schließlich ein guter Fahrer". Und das, obwohl man mit Gurt genauso schnell ans Ziel kommt.



  • @seppj sagte in Speicheradressen von Pointer:

    Klingt schon ein bisschen nach "Ich fahr' immer ohne Gurt und bisher ist mir nichts passiert, ich bin schließlich ein guter Fahrer".

    Mjo. Dem will ich auch nichts entgegensetzten. Im RL schnall ich mich jedenfalls an 😉 Und im Problemfall hat man immernoch den Debugger. Mit reinterpret_cast<> kann man übrigens auch vieles falsch machen.

    @seppj sagte in Speicheradressen von Pointer:

    Und das, obwohl man mit Gurt genauso schnell ans Ziel kommt.

    Für mich ist es halt die ganze Tipparbeit, die mich daran stört. Klar, hab grad einen Artikel gelesen, warum das auch so ugly aussehen sollte, aber dem folge ich dennoch nicht.


  • Mod

    @spiri sagte in Speicheradressen von Pointer:

    @seppj sagte in Speicheradressen von Pointer:

    Klingt schon ein bisschen nach "Ich fahr' immer ohne Gurt und bisher ist mir nichts passiert, ich bin schließlich ein guter Fahrer".
    

    Mjo. Dem will ich auch nichts entgegensetzten. Im RL schnall ich mich jedenfalls an 😉 Und im Problemfall hat man immernoch den Debugger. Mit reinterpret_cast<> kann man übrigens auch vieles falsch machen.

    Dass es gefährliche Sprachelemente gibt, bei deren Benutzung ohnehin alle Alarmglocken schrillen sollten (du verweist oben auch selber auf dynamic_cast), ist nicht gerade ein Argument für sorglosen Umgang damit 🙂



  • @spiri sagte in Speicheradressen von Pointer:

    Für mich ist es halt die ganze Tipparbeit, die mich daran stört.

    Vielleicht mache ich irgendwas falsch, aber das "Tippen" hat bei mir immer nur einen derart geringen Anteil an der Programmierarbeit, daß es mich nicht sonderlich stört, wenn der Code stellenweise etwas ausführlicher ist. Die meiste Zeit verbringe ich immer noch mit Denken, Code scannen/verstehen und Programme intensiv bei ihrer Lieblingsbeschäftigung, dem "Laufen" zu beobachten 😉



  • @spiri sagte in Speicheradressen von Pointer:

    @manni66 sagte in Speicheradressen von Pointer:

    Eine Variable je Zeile ist aber eine Fehlervermeidungsstrategie und das hat mit "gefallen" nichts zu tun.

    Wenn mans falsch macht, ja. Wenn man aber ein fundiertes Wissen im Bereich hat, sollte sowas nicht mehr vorkommen, sondern sich genau so einfach lesen lassen, wie Zeile für Zeile.

    Wissen alleine reicht nicht, man muss sowas auch trainieren. Und wozu? Für nix. Eine Zeile pro Variable ist einfach ganz klar besser. Genau so wie C++ Style Casts ganz klar besser sind als C Style Casts. "Ich kann das genau so gut lesen" ist mMn. auch das typische Argument von Leuten die wissen dass sie falsch liegen, sich (und anderen) aber einreden wollen dass es nicht so ist.



  • Hi,

    die Regel "Eine Variable pro Zeile" ist zwar durchaus sinnvoll aber ich glaube nicht, daß man sie mit missionarischem Eifer unter das Volk bringen muß. Es gibt durchaus Fälle, wo man sie auch mal brechen kann.

    int i,j,k;
    

    Was die C-style casts anbelangt, gebe ich zu, daß ich früher auch wegen Tipfaulheit diese dem C++ cast vorgezogen habe. Ich verwende C seit >30 Jahren und C++ seit >25 Jahren und habe auch gedacht, mir passieren da keine Fehler. Aber es ist dumm sowas zu denken. Auch wenn man wenig Fehler macht, 0 wird man nie erreichen.

    Ich habe mir jedenfalls angewöhnt,, nachdem mir doch mal ein falscher cast passiert ist, den ein C++ cast nicht erlaubt hätte, alle C-casts durch C++ casts zu ersetzen, die mir so in meinen Quellen begegnen.

    VG



  • @mgaeckler sagte in Speicheradressen von Pointer:

    Hi,

    die Regel "Eine Variable pro Zeile" ist zwar durchaus sinnvoll aber ich glaube nicht, daß man sie mit missionarischem Eifer unter das Volk bringen muß. Es gibt durchaus Fälle, wo man sie auch mal brechen kann.

    int i,j,k;
    

    Eben nicht. Alle Variablen sind nicht initialisiert, das ist Kritikpunkt 1. Wenn das iwelche Hilfsvariablen mit Laufindex oÄ sind dann intialisier´ sie wenigstens mit 0 (wobei ich das wirklich nicht mag):

    int i = 0, j = 0, k = 0;
    

    Wenn das nicht geht, weil sie verschiedene Initialwerte haben oder später gebraucht werden (bei Letzterem Kritikpunkt Nr. 2: halte Variablen so lokal wie möglich) sollte man sie so oder so in einer eigenen Zeile definieren.

    Was für mich ok ist sind Funktionsaufrufe, die Referenzen oder Zeiger haben wollen (zB in der WinAPI):

    bool some_function( int& refA, int& refB, int* refC );
    
    void my_function()
    {
       int i = 0, j = 0, k = 0;
       if( some_function( i, j, &c ) )
       {
       }
    }
    


  • @docshoe sagte in Speicheradressen von Pointer:

    int i = j = k = 0;

    Seit wann ist das denn erlaubt (also sofern jund knicht schon vorher definiert wurden)?



  • @th69 Hast natürlich recht. Wie gesagt, ich schreibe sowas nicht und habe mich eher schlecht als recht an Code vom Kollegen erinnert. Scheint heute mein Schludrigkeitstag zu sein, zwei Postings, zwei Böcke 😉
    Hab´s oben gefixt.



  • @docshoe

    Kanst gleich noch was fixen:

    a, b und c sind nicht definiert. Richtig ist

    bool some_function( int& refA, int& refB, int* refC );
    
    void my_function()
    {
       int i = 0, j = 0, k = 0;
       if( some_function( i, j, &k ) )
       {
       }
    }
    

    Ich persönlich schenke mir die Initialisierung, wenn die Variable gleich im nächsten Statement einen Wert erhält. Ich denke nicht, daß man hier päpstlicher wie der Papst sein muß. Aber was ich nie machen würde, die ersten zwei Variablen als Referenz und die dritte als Zeiger zu übergeben.

    VG Martin



  • @mgaeckler
    Heute ist mein Tag! 100% der relevanten Beiträge vergurkt.
    Ich leg mich jetzt hin, Gute Nacht und bis Morgen.

    Die Funktion some_function ist nur das worst-case Beispiel. Wenn man 3rd Party Libraries benutzt kann einem alles begegnen.
    Ich habe mir angewöhnt ausnahmslos alle Variablen zu initialisieren, selbst wenn es ein Output-Parameter einer Funktion ist und in der Funktion überschrieben wird. Wüsste jetzt auch keinen Fall, wo mir das um die Ohren geflogen ist, wenn ich´s nicht gemacht habe, aber damit halte ich mich an das Prinzip alles zu initialisieren. Mag übervorsichtig/gründlich sein, schadet aber auf keinen Fall.



  • @docshoe Ja schaden tut's nicht außer daß vieleicht die Funktion ein paar Nanosekunden länger braucht. 😈



  • @hustbaer sagte in Speicheradressen von Pointer:

    Wissen alleine reicht nicht, man muss sowas auch trainieren.

    Quatsch. Sowas weiß man einfach und dann macht man wie man Lust hast. Mehrere Variablen in einer Zeile zu definieren ist keine Königsdisziplin. Diese dann zu lesen genauso wenig. Wird alles noch im gleichen Kapitel abgehakt, hoff ich doch mal.

    @hustbaer sagte in Speicheradressen von Pointer:

    Genau so wie C++ Style Casts ganz klar besser sind als C Style Casts. "Ich kann das genau so gut lesen" ist mMn. auch das typische Argument von Leuten die wissen dass sie falsch liegen, sich (und anderen) aber einreden wollen dass es nicht so ist.

    Na klar. Dann lieg ich halt falsch und möchte euch allen wissentlich dem Falschen belehren. Fick dich. *

    Ich benutze dennoch C-Casts. Hab früher auch mal static_cast<> und anderes genommen, mach das jetzt aber nicht mehr, vermutlich auch nur um euch damit noch auf den Senkel zu gehen.

    stream.write(reinterpret_cast<char*>(&value), sizeof(value));
    vs.
    stream.write((char*)&value, sizeof(value));

    Wie in ganz vielen Bereichen der Programmierung kann man nicht immer mit allem bedenkenlos umgehen. Zumals in den Sprachen C und C++ sollte der Programmierer wissen was er tut. Und wenn der dann da angelangt und vernünftig programmieren kann, dann ist es egal, wie der in seinem Code rumcastet. Anders sieht das natürlich aus, wenn man gemeinsam an einem Projekt arbeitet, da sollte man sich dann wohl an eine Richtlinie halten.
    ich bin halt nicht der Befürwörter von C++-Style-Cast, will sie aber auch keinem ausreden, ehrlich. Alles was du brauchst um herauszufinden worum es in diesem Cast geht kannst du auch aus dem Context rauslesen. Kannst du. Kannst du sehr wohl.


Anmelden zum Antworten