Autor Beitrag
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 26.02.13 14:36 
Guten Tag, warum funktioniert folgendes nicht?

ausblenden 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..

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 26.02.13 14:40 
Moin,

ich denke, du möchtest folgendes Verhalten erreichen:

ausblenden 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.


Zuletzt bearbeitet von FinnO am Di 26.02.13 14:42, insgesamt 1-mal bearbeitet
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 26.02.13 14:42 
ok die möglichkeit ist besser und funktioniert :D
aber wieso funktioniert meine nicht?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2623
Erhaltene Danke: 1452

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 26.02.13 15:05 
Hallo,
ich habe Folgendes probiert:
ausblenden 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
Einloggen, um Attachments anzusehen!
_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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!

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2623
Erhaltene Danke: 1452

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ausblenden 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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 26.02.13 18:22 
Auch wenn Xor nun wahrlich kein super verständlicher Vergleichsoperator ist,
gibt es da neben der Möglichkeit:

ausblenden Delphi-Quelltext
1:
  if not((Dividend<0XOR (Divisor<0)) then Result := '+' else Result := '-';					



noch:

ausblenden Delphi-Quelltext
1:
  if ((Dividend<0XOR (Divisor<0)) then Result := '-' else Result := '+';					

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.

Für diesen Beitrag haben gedankt: Anika
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 26.02.13 18:30 
ausblenden 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.

Für diesen Beitrag haben gedankt: Tranx
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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:

ausblenden 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 26.02.13 18:54 
Das sollte man bei Divisionen ja ohnehin.