"this" - Zeiger



  • Hallo,

    in Java kann man ja folgendes machen:

    int param;
    public void methode(int param) {
       this.param = param;
    }
    

    Wie würde ich das äquivalent in C schreiben? Oder bin ich wirklich gezwungen, die Parameter anders als lokale Variablen zu benennen?

    Vielen Dank!



  • In C gibt es keine Methoden. Das zubearbeitende Objekt wird meist als Pointer uebergeben.

    void methode(struct YourObject* yop, int param)
    {
        yop.param = param;
    }
    

  • Mod

    Bist du sicher, dass du C meinst, nicht C++?

    (In C++ gäbe es übrigens, wie in Java, einen this-Zeiger)

    P.S.:

    knivil schrieb:

    void methode(struct YourObject* yop, int param)
    {
        yop.param = param;
    }
    

    ->

    yop->param = param;
    


  • Aber strtok macht es doch beispielsweise so, dass der Parameter intern gespeichert wird, also schon so eine Art Methode, oder nicht?


  • Mod

    coder21 schrieb:

    Aber strtok macht es doch beispielsweise so, dass der Parameter intern gespeichert wird, also schon so eine Art Methode, oder nicht?

    strtok verändert den Ursprungsstring und speichert so Informationen zwischen. Oder benutzt, je nach Implementierung, sogar statischen (=globalen) Speicher, wodurch die Funktion dann nicht mehr multithreadingfähig ist.



  • Nicht nur nicht multithreadingfähig, sondern auch nicht reentrant. Etwa ist

    char buf[] = "1,2,3;4,5,6;7,8,9";
    
    for(char *p = strtok(buf, ";"); p; p = strtok(NULL, ";")) {
      for(char *q = strtok(p, ","); q; q = strtok(NULL, ",")) {
        // Kawumm!
      }
    }
    

    kaputt, auch mit nur einem Thread.

    Man könnte sich vielleicht winden und das als "Methode auf einem Singleton" auffassen oder etwas in der Art, aber ich halte solche Sichtweisen nicht für nützlich.



  • seldon schrieb:

    Nicht nur nicht multithreadingfähig, sondern auch nicht reentrant.

    Manche C-Funktionen sind einfach schlecht. strtok ist eine davon (scheint auch nur bei Anfängern beliebt zu sein)

    Das Reentrant-Problem löst strtok_r , das grundsätzliche Design-Problem bleibt.



  • SeppJ schrieb:

    yop->param = param;
    

    Ja 🙂


Log in to reply