[gelöst] C reinterpret_cast



  • Hallo ihr Lieben,

    ich habe mal wieder eine wahrscheinlich ziemlich dumme Frage:

    In diesem Beispiel der GSL stehen ziemlich zu Beginn die Zeilen.

    struct my_f_params { double a; double b; double c; };
    
    double
    my_f (double x, void * p) {
       struct my_f_params * params = (struct my_f_params *)p;
       double a = (params->a);
       double b = (params->b);
       double c = (params->c);
    
       return  (a * x + b) * x + c;
    }
    

    Was soll mir dabei Zeile 5 sagen? Ich möchte einen Pointer namens params der Struktor my_f_params und er kriegt die Adresse von ...?
    Warum steht da nicht einfach p , sondern schon wieder der Typ, nämlich struct my_f_params* .
    Ist das eine Art typ cast? Ich würde 'heute' dann schreiben:

    my_f_params* params = reinterpret_cast<my_f_params*>(p)
    

    Gruß,
    -- Klaus.



  • static_cast nicht reinterpret_cast

    In C wäre dieser Cast sogar garnicht notwendig.

    PS:
    Der Grund für diese Zeile ist vermutlich ein vorgegebenes Interface. Wenn du zB wie bei qsort() ein generisches Callback angeben muss, gehen die Typinformationen ja verloren. Dazu brauchst du dann den void* der quasi nur die Adresse der Daten beinhaltet die du übergeben willst - und mittels cast holst du dir dann ein Objekt mit dem du arbeiten kannst.



  • Shade Of Mine schrieb:

    Der Grund für diese Zeile ist vermutlich ein vorgegebenes Interface.

    Das vermute ich auch.

    Ich habe den Eindruck, dass bei C++ (salopp formuliert) der Typ stets mit angegeben werden muss. Ruft eine Funktion die Variable a auf, so muss schon im Prototyp stehen foo(int/double a).

    Und so will C++ scheinbar auch bei Pointern wissen: "Pointer auf welchen Typ?"

    Dieser void Pointer scheint eine Art Notnagel zu sein: "Es ist eine Adresse auf ... etwas."

    Und für das Interface wie die GSL muss ich jetzt aber in der Funktion wieder klar machen, dass dieser Pointer auf einen Typ zeigt, den die GSL erwartet, also muss ich einen typ cast nachschieben.

    Kann man das so ungefähr sagen?

    Gruß,
    -- Klaus.



  • Klaus82 schrieb:

    Kann man das so ungefähr sagen?

    Ja.

    Wobei ich statt "Notnagel" eher "generisch" sagen würde. void* ist einfach nur eine Adresse ohne Typinformation.

    Aber das sind semantics...

    Als beispiel:
    int* p;
    hier kann ich ++p; machen weil ich ja weiss wie breit ein int ist und weiviele Bytes ich weiter gehen muss um den nächsten int zu bekommen.
    void* p;
    hier kann ich kein ++p; machen, da ich nicht weiss wie breit die Daten sind.



  • Alles klar, vielen Dank! 🙂

    Gruß,
    -- Klaus.


Anmelden zum Antworten