Auf Feld aus Klasse zugreifen
-
@Redhat: Was kann ich anders machen? Kann ich den Rückgabewert irgendwie const definieren...? Frage is dann natürlich, ob die Funktionen, dennen ich den Pointer übergebe auch keine manipulationen machen....aber ich denke OpenGL hält sich da zurück.
-
wenn du floats vergleicht musst du aufpassen. denn float ist nicht genau, dh der eine wert kann 0.69999 sein und der andre 0.70001
-
1.) Entweder du gibt die Farben einzeln, also als GLflaot nach dem Muster
GLflaot getColor(int Index)zurück. Ist natürlich dann nicht sinnvoll wenn du immer nur den Array als
Ganzes benötigst.2.) Du erstellst bei jedem Aufruf eine Kopie des Originals. Das macht dann
keinen Sinn wenn du die Funktion immer und immer wieder aufrufst.3.) Du lieferst einen const-Zeiger zurück, d.h. eine Zeiger dessen Wert nicht
verändert werden darf. Der const kann natürlich weg gecastet werden. Aber wenn
das compiliert, dann siehst du zumindest ob die "Datenweitergabe" sauber ist,
also ohne Änderung der Originaldaten abläuft.
-
DerAnfänger2005 schrieb:
@Redhat: Was kann ich anders machen? Kann ich den Rückgabewert irgendwie const definieren...? Frage is dann natürlich, ob die Funktionen, dennen ich den Pointer übergebe auch keine manipulationen machen....aber ich denke OpenGL hält sich da zurück.
jep siehe dazu zb: http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=constcor#Answ
und gl ist es egal bsp: const float *getcolor() const;
-
Das mit den leichten Abweichungen scheint(!) aber nicht gegeben zu sein. In "a" steht nämlich exact 0.7 drinnen. Ohne Abweichung.
Bei solchen Sachen schwindet mein Lust immer ganz ungemein...

-
schreib mal testweise den vergleich um:
#include <limits>//muss noch rein für numeric_limits if(Sender->getColor()[0] - 0.7 <= numeric_limits<float>::epsilon()){ }
-
DerAnfänger2005 schrieb:
Das mit den leichten Abweichungen scheint(!) aber nicht gegeben zu sein. In "a" steht nämlich exact 0.7 drinnen. Ohne Abweichung.
Nun, ich wage dies schwer zu bezweifeln.

0.7 ist eine von den (massig) Zahlen die leider garnicht "exact" in float oder double abgebildet werden können (bei der Umwandlung in eine Binärmantisse entsteht eine Periode), folglich sind schon ein double und ein float mit 0.7 nicht gleich. Nun benutzt der Compiler für Fliesskommaliterale je nach Plattform zudem noch die Auflösung der prozessorinternen Fliesskommaregister (z.B. 80 Bit bei x86), wodurch die Konstante 0.7 schon ungleich einer in float/double gespeicherten werden kann.
Fazit: == ist für Fliesskommazahlen quasi tabu, es sei denn man weiss sehr genau was man tut (und wann weiss man das schon
).
-
Ich hab die Lösung. Sie besteht aus einem kleinen "f"
Wenn ich
if ( Sender->getColor()[0] == 0.7f ) Sender->setColor(0.5,0.8,0.9); else Sender->setColor(0.7,0.9,0.0);schreibe, dann klappt das mit dem Vergleich.
Jetzt würde mich interessieren, ob das nur ein Glückstreffer aufgrund irgendeines Compilervorgangs war, oder ob man sich auf sowas verlassen kann. Was passiert, wenn man den Typ so mit angibt?
-
Glückstreffer
-
verlassen kannst du dich nur drauf, wenn die funktion genau 0.7f liefert.
wenn sie aber so aussieht:
float foo(){ return 0.3f+0.4f; }dann kriegst dun echtes problem, weil die rechnung nicht genau 0.7f ergibt.
-
Aha... Also die spezielle Funktion gibt immer den Wert zurück der vorher mit setColor(r,g,b) übergeben wurde. Der User sollte also wissen, was er für sachen da reinschreibt.
Was ist den die einfachste Methode um floats zu vergleichen? Also das mit dem Epsilon scheint mir bisl heftig...
-
DerAnfänger2005 schrieb:
Was ist den die einfachste Methode um floats zu vergleichen? Also das mit dem Epsilon scheint mir bisl heftig...
ist wohl die einfachste und typensicherste
-
Die beste Sache ist natürlich dein Design so zu ändern das sowas nicht mehr nötig ist.

-
Na dann erklär mir mal was ich da ändern soll...

-
DerAnfänger2005 schrieb:
Na dann erklär mir mal was ich da ändern soll...

mach doch eine methode (wie ich beschrieben habe) und kombiniere diese mit epsilon (wie otze geschrieben hat)
bool blubb::checkval(size_t index, size_t val) { // logischerweise index prüfen return(color[index] - val <= numeric_limits<float>::epsilon()); } void func() { // .. if(Senden->checkval(0, 0.7f) // .. }