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
-
Ein
*
auf einen Zeiger angewandt macht daraus das Ding hinter dem Zeiger.imgBG
ist ein Zeiger auf eincImage
, also ist*imgBG
dascImage
selbst, auf das dieser Zeiger zeigt.Ob das dann mit dem Aufruf von
DrawImage
so passt, ob dieses eincImage
oder einen Zeiger auf eincImage
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 demcImage*
eincImage
. Er "dereferenziert" den Pointer.Oder präziser: Das Ergebnis von
*x
für eine Variable¹x
von TypT*
("Zeiger auf T") ist ein Lvalue-Ausdruck, welcher das potentielle Objekt vom TypT
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
eincImage*
zurückgibt, um z.B. mit dem Wertnullptr
einen Fehler zu signalisieren, währendDrawImage
eincImage
,cImage&
oderconst cImage&
erwartet, da es hier wahrscheinlich keinen Sinn macht, auch Null-Werte zuzulassen. Und um aus einemcImage*
eincImage
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 eincImage*
beiDrawImage
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 diex
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?
-
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.
-
@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 einimg
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 einimg
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 einimg
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.
-
@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.
-
@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 einimg
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 einimg
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 ...
-
@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