komische fehler !(1) = 1
-
Was ist denn mit "guten" Operatoren gemeint? - Hab das noch nie gehört.
Werte sind:
a = +0
b = +0.001
und dann gibt es:
1
1
und das kann ja eigentlich nicht sein.Vielen Dank schonmal im voraus,
etlam
-
also wenn du es mit double bzw. float zu tun hast, sollte das Programm garnicht erst in die Schleife eintreten (da a<b und die Schleifenbedingung schon zu Anfang nicht erfüllt ist) hast du eventuell vor oder nach der Schleife noch Ausgaben, die das verursachen könnten?
-
a und b sind vom Typ rol (siehe Signatur)
Die Variablen werden so initialisiert, dass in die Schleife eingetreten wird.
übrigens habe ich jetzt auch folgendes versucht:bool x = true; while(x) { cout << x << "\n"; //Viel Code if(a<b) { x = false; } }So dürfte ich eigentlich nie die Ausgabe 0 bekommen, aber ich bekomme sie.
Irgendwie ist das alles sehr seltsam....Vielen Dank schonml im voraus,
etlam
-
Dann mach mal folgendes: gib erstens in der Schleife mal a und b direkt aus, wenn das geht. Und dann schreib einfach mal ein kleines Testprogramm mit
int main() { rol a = 0.0; rol b = 0.0001; cout << a << ' ' << b << ' ' << (a<b) << endl; }Eventuell steckt ja der Wurm irgendwo im operator<
-
Also:
bevor der ganze Rest anfängt, habe ich zwei Variablen genommen, ihnen genau die selben Werte gegeben und genau gleich ausgegeben:
+0>+0.001 : 0
heißt es da.
Nun habe ich irgendwo danach eine Schleife:while(a>b) { cout << a << ">" << b << " : " << (a>b) << "\n"; //Viel Code }Hier wird jetzt auch
+0>+0.001 : 0
ausgeben, aber das dürfte doch eigentlich nicht ausgegeben werden, da die Schleife ja dann abbrechen müsste.
Kann es vielleicht ein Fehler in GCC sein?Vielen Dank schonmal im voraus,
etlam
-
welche Datentypen haben eigtl. a und b?
-
etlam schrieb:
a und b sind vom Typ rol (siehe Signatur)
mfg,
julian
-
Gib doch mal mehrfach das Ergebnis von a > b aus, also 10mal a > b aufrufen und Ergebnis ausgeben. Kann gut sein, dass da nicht immer das selbe raus kommt.
-
Mit guten Operatoren meinte ich solche, die sich eben verhalten wie arithmetische Operatoren. Wie sind die denn bei deinem rol-Typ implementiert?
-
Jetzt habe ich nichts geändert und das ganze auf mit einer anderen Live-Cd probiert - da ging es auf einmal - und das komischste ist, dass es dort wo es vorher nicht ging jetzt auf einmal auch geht!
etlam
-
etlam schrieb:
Jetzt habe ich nichts geändert und das ganze auf mit einer anderen Live-Cd probiert - da ging es auf einmal - und das komischste ist, dass es dort wo es vorher nicht ging jetzt auf einmal auch geht!
etlam
Hört sich für mich so an, als wäre da eine temporäre Datei benutzt worden die nicht mehr auf dem aktuellsten Stand war.
Falls du mal wieder sowas hast, dann lösch alle temporäre Dateien und mach ein komplettes Rebuild.
-
Alsomein Programm selber benutzt keine Temporänen Dateien, und ich benutzKnoppix, und auch wenn ich nach dem starten direkt es versucht hatte, ging es nicht.
Jetzt geht es, aber nur wenn ich am ende der schleife soetwas mache:if(a>b) { ; }Komisch, oder?
etlam
-
Es handelt sich bei rol doch um einen von Dir selbst geschriebenen Datentyp, oder? Hast Du schonmal daran gedacht, dass Dein operator< einfach kaputt sein könnte?
-
Ich meinte die temporären Dateien die dein Kompiler erstellt, die erstellt er damit er nicht jedes mal das gesamte Projekt neu übersetzen muss.
Zeig mal den Code für deinen op> (also für die aktuelle Version mit der dieses Problem auftritt).
Und hast du mal folgendes versucht:
for( int i = 0; i < 20; ++i ) cout << ( a > b ) << "\n";Würde mich mal interressieren ob da immer das gleiche herauskommt, falls nicht ist dein op> auf jeden Fall fehlerhaft.
-
Also wegen temporänen Dateien: Ich benutz z.Z. Knoppix, da ist nix mit temporänen Dateien, wenn ich neu starte, da Knoppix ja eine Live-Cd Distribution ist.
Der Operator > funktioniert.
Ich habe mir das ganze auch oft ausgeben lassen, wie vorgeschlagen, und es kommt immer das richtige Ergebnis raus, nur im while() und if() wird die Rückgabe falsch interpretiert oder umgewandelt oder so.etlam
-
etlam schrieb:
Also:
bevor der ganze Rest anfängt, habe ich zwei Variablen genommen, ihnen genau die selben Werte gegeben und genau gleich ausgegeben:
+0>+0.001 : 0
heißt es da.Wenn du ihnen genau die selben Werte gegeben hast, ist doch arg verwunderlich, dass da einmal "0" und einmal "0.001" steht.
Vielleicht postest du mal kurz die relevanten Teile deiner Klassendefinition.
-
Kann natürlich auch sein, dass du dir irgendwo den Stack oder den Heap zerschossen hast. Es sollte mich jedenfalls arg wundern wenn da der GCC einen Fehler gemacht hätte. Übersetz das Programm mal mit verschiedenen Optionen (-O0 -O1 -O2 -O3 -Os -g -p) wenn sich das Programm verschieden verhält dann ist das dein Fehler.
-
pumuckl schrieb:
etlam schrieb:
Also:
bevor der ganze Rest anfängt, habe ich zwei Variablen genommen, ihnen genau die selben Werte gegeben und genau gleich ausgegeben:
+0>+0.001 : 0
heißt es da.Wenn du ihnen genau die selben Werte gegeben hast, ist doch arg verwunderlich, dass da einmal "0" und einmal "0.001" steht.
Vielleicht postest du mal kurz die relevanten Teile deiner Klassendefinition.Also mit dieselben Werte meine ich natürlich die selben Werte, wie sie hinterher in der Schleife vorkommen!
Das mit den verschiedenen Optionen werde ich morgen ausprobieren, Vielen Dank für den Hinweis.
etlam
-
Sag mal, schämst du dich für deinen Code? Nun zeig' ihn doch endlich her!
-
Das ist der Code für den Operator >:
bool& operator>(rol& a, rol& b) { bool aistbruch=0; bool bistbruch=0; int awo = 0; int bwo = 0; int asize = a.wert.size(); int bsize = b.wert.size(); while(awo != asize) { if(a.wert[awo]=='|') { aistbruch=1; } awo++; } while(bwo != bsize) { if(b.wert[bwo]=='|') { bistbruch=1; } bwo++; } static bool reuckgabe; if((aistbruch==1)||(bistbruch==1)) { if(aistbruch==0) { a.wert = bbeideszubruch(a.wert); } if(bistbruch==0) { b.wert = bbeideszubruch(b.wert); } a.wert = vmachevorzeichen(a.wert); b.wert = vmachevorzeichen(b.wert); reuckgabe = vbistgroesser(a.wert,b.wert); } else { a.wert = vmachevorzeichen(a.wert); b.wert = vmachevorzeichen(b.wert); reuckgabe = vistgroesser(a.wert,b.wert); } return(reuckgabe); }Vielen Dank schonmal im voraus,
etlam