Frage zu Zeiger



  • Ich habe folgendes Codebeispiel:

    cImage *imgBG = imgLoader.LoadIcon("logo_background", imageHeight * 1.34, imageHeight);
        if (imgBG) {
            imageBGHeight = imgBG->Height();
            imageBGWidth = imgBG->Width();
            chanLogoBGPixmap->DrawImage(cPoint(imageLeft, imageTop), *imgBG);
        }
    

    Wie ist das mit dem *? Ist das so richtig in der letzten Zeile, dass das Bild/Objekt mit *imgBG übergeben wird? Definiert wurde es ja in der ersten Zeile mit cImage *imgBG =
    Bin da irgendwie durcheinender


  • Mod

    Ein * auf einen Zeiger angewandt macht daraus das Ding hinter dem Zeiger. imgBG ist ein Zeiger auf ein cImage, also ist *imgBG das cImage selbst, auf das dieser Zeiger zeigt.

    Ob das dann mit dem Aufruf von DrawImage so passt, ob dieses ein cImage oder einen Zeiger auf ein cImage erwartet, musst du selber in der Anleitung nachlesen. Der Compiler sollte sich aber lautstark beschweren, wenn die Typen in deinem Code nicht passen.



  • @MegaV0lt sagte in Frage zu Zeiger:

    Wie ist das mit dem *? Ist das so richtig in der letzten Zeile, dass das Bild/Objekt mit *imgBG übergeben wird? Definiert wurde es ja in der ersten Zeile mit cImage *imgBG

    Salopp gesprochen macht der vorangestellte * aus dem cImage* ein cImage. Er "dereferenziert" den Pointer.

    Oder präziser: Das Ergebnis von *x für eine Variable¹ x von Typ T* ("Zeiger auf T") ist ein Lvalue-Ausdruck, welcher das potentielle Objekt vom Typ T bezeichnet, auf das der Pointer zeigt. Aber nur, wenn dort auch tatsächlich ein Objekt liegt, ansonsten ist es bei Zugriff UB.

    Ohne die Funktionssignaturen zu kennen, würde ich annehmen, dass imgLoader.LoadIcon ein cImage* zurückgibt, um z.B. mit dem Wert nullptr einen Fehler zu signalisieren, während DrawImage ein cImage, cImage& oder const cImage& erwartet, da es hier wahrscheinlich keinen Sinn macht, auch Null-Werte zuzulassen. Und um aus einem cImage* ein cImage zu machen, das z.B. an eine solche Referenz binden kann, verwendet man den vorangestellten Dereferenzierungs-Operator *. Was für Typen die Funktionen exakt erfordern, ist meist eine Designentscheidung der Bibliothek. Es hätte auch ein cImage* bei DrawImage sein können, dann wär der Stern nicht nötig gewesen.

    ¹ Edit: Statt "Variable" könnte hier auch allgemeiner "Ausdruck" stehen, denn nicht nur Variablen lassen sich so dereferenzieren: *(x + 2) dereferenziert z.B. das dritte Objekt vom Typ T im zusammenhängenden Speicherbereich, der bei der Adresse begrinnt, auf die x zeigt.



  • Vielen Dank erst mal für die Antworten. Die Funktion sieh so aus:

    cImage* cImageLoader::LoadIcon(const char *cIcon, int width, int height) {
        if ((width == 0) || (height == 0))
            return NULL;
    
        cString File = cString::sprintf("%s%s/%s.%s", *Config.iconPath, Setup.OSDTheme, cIcon, *logoExtension);
    
        cImage *img;
        img = imgCache.GetImage(*File, width, height);
        if (img)
            return img;
    
        bool success = LoadImage(*File);
    
        if (!success) {
            File = cString::sprintf("%s%s/%s.%s", *Config.iconPath, "default", cIcon, *logoExtension);
            img = imgCache.GetImage(*File, width, height);
    
            if (img)
                return img;
    
            success = LoadImage(*File);
    
            if (!success) {
                dsyslog("imageloader LoadIcon: %s could not be loaded", *File);
                return NULL;
            }
        }
    
        img = CreateImage(width, height);
        if (!img)
            return NULL;
    
        imgCache.InsertImage(img, *File, width, height);
        return img;
    }
    
    

    Sieht für mich komisch aus. Es wird wohl cImage* zurückgegeben und ein Zeiger erwartet?


  • Mod

    Was soll daran komisch aussehen? Ist halt in C geschrieben, daher schaut das anders aus als typisches C++.



  • DrawImage ist mehrmals vorhanden.

      virtual void DrawImage(const cPoint &Point, const cImage &Image) = 0;
           ///< Draws the given Image into this pixmap at the given Point.
      virtual void DrawImage(const cPoint &Point, int ImageHandle) = 0;
           ///< Draws the image referenced by the given ImageHandle into this pixmap at
           ///< the given Point. ImageHandle must be a value that has previously been
           ///< returned by a call to cOsdProvider::StoreImage(). If ImageHandle
           ///< has an invalid value, nothing happens.
    

    Sollte ich also liber & verwenden oder wird das durch die Deklaration automatisch gemacht?



  • ... cImage &Image) = 0;

    bewirkt, dass die Funktion Dein Image nicht als (möglicherweise aufwendige) Kopie bekommt, sondern eine Referenz darauf, Dein Aufruf muss dafür nicht geändert werden.


  • Gesperrt

    @MegaV0lt sagte in Frage zu Zeiger:

    Sieht für mich komisch aus.

    "Sieht komisch aus" ist keine exakte Fragestellung. Sie lässt keine exakte Antwort zu, nur eine ungefähre.

    Man kann sagen, zu 90 Prozent erwarten solche Funktionen einen img* (Pointer) als Funktionsparameter. Genauso kann man sagen, in 10 Prozent der Fälle wird ein img als Übergabe erwartet. Man kann allerdings nichts sagen, dieses oder jenes sei richtig oder falsch, ohne die Lib zu kennen.

    Naja, wie sich nun herausgestellt hat, wird ein img weiches nicht kopiert wird erwartet. Aber, ob es modifiziert wird: 🤷♂



  • @meuterei sagte in Frage zu Zeiger:

    "Sieht komisch aus" ist keine exakte Fragestellung. Sie lässt keine exakte Antwort zu, nur eine ungefähre.

    "Sieht komisch aus" ist gar keine Frage, sondern eine Aussage, und verlangt daher keine Antwort.

    Man kann sagen, zu 90 Prozent erwarten solche Funktionen einen img* (Pointer) als Funktionsparameter. Genauso kann
    man sagen, in 10 Prozent der Fälle wird ein img als Übergabe erwartet. Man kann allerdings nichts sagen, dieses oder jenes sei richtig oder falsch, ohne die Lib zu kennen.

    Aha, kann man das so sagen? Es sind also exakt 90%? Oder sogar 91%? Oder nur 89%? Kannst du Belege für deine "Antwort" liefern?
    Komplett sinnbefreiter Beitrag... Das kommt dabei rum, wenn man schlau klingen möchte.



  • @DocShoe sagte in Frage zu Zeiger:

    Komplett sinnbefreiter Beitrag... Das kommt dabei rum, wenn man schlau klingen möchte.

    Ja, der Stil erinnert mich stark an etwas, das ich hier in letzter Zeit schon wiederholt gelesen hab 🤔 ... sicher nur Einbildung.



  • @meuterei sagte in Frage zu Zeiger:

    @MegaV0lt sagte in Frage zu Zeiger:

    Sieht für mich komisch aus.

    "Sieht komisch aus" ist keine exakte Fragestellung. Sie lässt keine exakte Antwort zu, nur eine ungefähre.

    Man kann sagen, zu 90 Prozent erwarten solche Funktionen einen img* (Pointer) als Funktionsparameter. Genauso kann man sagen, in 10 Prozent der Fälle wird ein img als Übergabe erwartet. Man kann allerdings nichts sagen, dieses oder jenes sei richtig oder falsch, ohne die Lib zu kennen.

    Naja, wie sich nun herausgestellt hat, wird ein img weiches nicht kopiert wird erwartet. Aber, ob es modifiziert wird: :man_shrugging:

    Da die Referenz konstant ist, eher nicht.


  • Mod

    @Finnegan sagte in Frage zu Zeiger:

    @DocShoe sagte in Frage zu Zeiger:

    Komplett sinnbefreiter Beitrag... Das kommt dabei rum, wenn man schlau klingen möchte.

    Ja, der Stil erinnert mich stark an etwas, das ich hier in letzter Zeit schon wiederholt gelesen hab 🤔 ... sicher nur Einbildung.

    Ja, er ist es. Hat es sogar in seinem ersten Beitrag direkt gesagt.


  • Gesperrt

    @DocShoe sagte in Frage zu Zeiger:

    @meuterei sagte in Frage zu Zeiger:

    "Sieht komisch aus" ist keine exakte Fragestellung. Sie lässt keine exakte Antwort zu, nur eine ungefähre.

    "Sieht komisch aus" ist gar keine Frage, sondern eine Aussage, und verlangt daher keine Antwort.

    Man kann sagen, zu 90 Prozent erwarten solche Funktionen einen img* (Pointer) als Funktionsparameter. Genauso kann
    man sagen, in 10 Prozent der Fälle wird ein img als Übergabe erwartet. Man kann allerdings nichts sagen, dieses oder jenes sei richtig oder falsch, ohne die Lib zu kennen.

    Aha, kann man das so sagen? Es sind also exakt 90%? Oder sogar 91%? Oder nur 89%? Kannst du Belege für deine "Antwort" liefern?
    Komplett sinnbefreiter Beitrag... Das kommt dabei rum, wenn man schlau klingen möchte.

    Nein, du hast ihn nicht verstanden, etwas dämlich. Das ist ein Unterschied. Kurz gesagt: Ein Blödmann weiß selber nicht, dass er blöd ist. Aber andere können dies ihm natürlich sagen.



  • @meuterei sagte in Frage zu Zeiger:

    @DocShoe sagte in Frage zu Zeiger:

    @meuterei sagte in Frage zu Zeiger:

    "Sieht komisch aus" ist keine exakte Fragestellung. Sie lässt keine exakte Antwort zu, nur eine ungefähre.

    "Sieht komisch aus" ist gar keine Frage, sondern eine Aussage, und verlangt daher keine Antwort.

    Man kann sagen, zu 90 Prozent erwarten solche Funktionen einen img* (Pointer) als Funktionsparameter. Genauso kann
    man sagen, in 10 Prozent der Fälle wird ein img als Übergabe erwartet. Man kann allerdings nichts sagen, dieses oder jenes sei richtig oder falsch, ohne die Lib zu kennen.

    Aha, kann man das so sagen? Es sind also exakt 90%? Oder sogar 91%? Oder nur 89%? Kannst du Belege für deine "Antwort" liefern?
    Komplett sinnbefreiter Beitrag... Das kommt dabei rum, wenn man schlau klingen möchte.

    Nein, du hast ihn nicht verstanden, etwas dämlich. Das ist ein Unterschied. Kurz gesagt: Ein Blödmann weiß selber nicht, dass er blöd ist. Aber andere können dies ihm natürlich sagen.

    Du brauchst Dich nicht zu entschuldigen ...


  • Gesperrt

    @Belli sagte in Frage zu Zeiger:

    Du brauchst Dich nicht zu entschuldigen

    Wieso redest du denn mit einem gesperrten Benutzer?



  • Du bist ein richtiges Stehaufmännchen ... oh Mann, muss Dein Leben trist sein


Anmelden zum Antworten