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:
//Dividend und Divisor sind Extended-var und Result ein String
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:
//Dividend und Divisor sind Extended-var und Result ein String
if NOT ((Dividend < 0XOR (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. user profile iconjaenicke 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 user profile iconIhopeonlyReader 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  notandorxor.


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,
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
ein Unterschied ist vor Allem, dass user profile iconIhopeonlyReader 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.
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Booleans in Abfragen sollten daher grundsätzlich mit den richtigen Operatoren verknüpft werden und das sind nun einmal  notandorxor.

Selbstverständlich. Da gibt es keinen Widerspruch.

Hallo Tranx,
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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<0XOR (Divisor<0)) then Result := '+' else Result := '-';                    



noch:


Delphi-Quelltext
1:
  if ((Dividend<0XOR (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<0then 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.