Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Rueckgabewert von < > und =
IhopeonlyReader - Di 26.02.13 14:36
Titel: Rueckgabewert von < > und =
Guten Tag, warum funktioniert folgendes nicht?
Delphi-Quelltext
1: 2:
| if ((Dividend < 0) = (Divisor < 0)) then Result := '+' else Result := '-'; |
Wenn 1 Variable neg. eine pos ist, oder beide pos sind dann funktioniert es, wenn beide neg sind nicht..
FinnO - Di 26.02.13 14:40
Moin,
ich denke, du möchtest folgendes Verhalten erreichen:
Delphi-Quelltext
1: 2:
| if NOT ((Dividend < 0) XOR (Divisor < 0)) then Result := '+' else Result := '-'; |
Natürlich ungetestet.
IhopeonlyReader - Di 26.02.13 14:42
ok die möglichkeit ist besser und funktioniert :D
aber wieso funktioniert meine nicht?
Gausi - Di 26.02.13 14:42
Ich würde darauf wetten, dass das daran liegt, dass "False" Null ist, und alles andere wahr. Könnte sein, dass der "genaue Wert" des Vergleichs nicht unbedingt definiert ist (Hauptsache, nicht Null).
Die Variante mit NOT .. XOR sollte klappen.
FinnO - Di 26.02.13 14:43
Da ich nicht weiß, ob dein Code kompiliert, nehme ich das einfach mal an. Ich befürchte, die Nichtfunktion deines Codes ist auf Besonderheiten beim vergleich auf
true zurückzuführen. Üblicherweise kann da jedoch z.B.
jaenicke mehr zu sagen.
... na, da war ja wieder einer schneller.
Mathematiker - Di 26.02.13 15:05
Hallo,
ich habe Folgendes probiert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var dividend,divisor:integer; c:char; begin dividend:=strtoint(edit1.text); divisor:=strtoint(edit2.text); if ((Dividend < 0) = (Divisor < 0)) then c := '+' else c := '-'; label1.caption:=c; end; |
Und nun meine Frage: Wieso funktioniert das bei Dir nicht?
Gebe ich zwei negative Zahlen ein, erhalte ich korrekt "+".
D.h., zumindest bei Delphi 5 wird es für integer-Größen, aber auch extended, korrekt ausgeführt. Im Anhang befindet sich das Testprogramm.
Beste Grüße
Mathematiker
FinnO - Di 26.02.13 17:08
Moin,
ein Unterschied ist vor Allem, dass
IhopeonlyReader einen anderen Datentyp verwendet als du. Trotzdem sollte man von Vergleichen auf
true absehen, wie Gausi ja auch schon erwähnt hat, liegt der Fehler wahrscheinlich darin, dass sich die tatsächlichen Werte von Wahren Boolean-Ausdrücken intern unterscheiden können.
Booleans in Abfragen sollten daher grundsätzlich mit den richtigen Operatoren verknüpft werden und das sind nun einmal
not, and, or, xor.
Tranx - Di 26.02.13 17:45
Also, ich habe das Ganze mit Delphi5 und Extended-Variablen getestet. Das Ganze funktioniert, so wie es sein soll. Bei beiden Zahlen negativ kommt + heraus.
Eigentlich ist das auch nicht logisch, dass der Vergleich TRUE = TRUE nicht TRUE ist!
Mathematiker - Di 26.02.13 17:46
Hallo FinnO,
FinnO hat folgendes geschrieben : |
ein Unterschied ist vor Allem, dass IhopeonlyReader einen anderen Datentyp verwendet als du. |
Ich habe jetzt extended und string verwendet
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var dividend,divisor:extended; c:string; begin dividend:=strtofloat(edit1.text); divisor:=strtofloat(edit2.text); if ((Dividend < 0) = (Divisor < 0)) then c := '+' else c := '-'; label1.caption:=c; end; |
und es funktioniert trotzdem! Jetzt interessiert es mich richtig. Könnte einer von Euch einmal prüfen, ob oder ob nicht es auch bei seinem Compiler funktioniert. Danke.
FinnO hat folgendes geschrieben : |
| Booleans in Abfragen sollten daher grundsätzlich mit den richtigen Operatoren verknüpft werden und das sind nun einmal not, and, or, xor. |
Selbstverständlich. Da gibt es keinen Widerspruch.
Hallo Tranx,
Tranx hat folgendes geschrieben : |
| Also, ich habe das Ganze mit Delphi5 und Extended-Variablen getestet. Das Ganze funktioniert, so wie es sein soll. |
Dank für den Test.
Beste Grüße
Mathematiker
Tranx - Di 26.02.13 18:22
Auch wenn Xor nun wahrlich kein super verständlicher Vergleichsoperator ist,
gibt es da neben der Möglichkeit:
Delphi-Quelltext
1:
| if not((Dividend<0) XOR (Divisor<0)) then Result := '+' else Result := '-'; |
noch:
Delphi-Quelltext
1:
| if ((Dividend<0) XOR (Divisor<0)) then Result := '-' else Result := '+'; |
WasWeißDennIch - Di 26.02.13 18:30
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| uses math; ... if sign(Dividend) <> sign(Divisor) then Result := '-' else Result := '+'; |
Oder andersherum, je nachdem, was man besser versteht.
Tranx - Di 26.02.13 18:47
Ich hätte noch eine Lösung, die allerdings nicht gilt, wenn der Divisor = 0 ist. Aber dann ist der Bruch eh nicht definiert:
Delphi-Quelltext
1:
| if (Dividend * Divisor<0) then Result := '-' else Result := '+'; |
Denn bekanntlich gelten ja für die Division die gleichen Vorzeichenregeln wie für die Multiplikation. Allerdings: Für Divisor 0 ist das Ergebnis mit 0 auf jeden Fall ein '+' und damit für negative Dividenden falsch. Aber diese Berechnung würde ich - um Programmabstürze zu vermeiden - unbedingt vorher abfangen.
WasWeißDennIch - Di 26.02.13 18:54
Das sollte man bei Divisionen ja ohnehin.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!