Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein (https://www.delphipraxis.net/188339-elegante-loesung-gesucht-3-boolean-werte-nur-einer-darf-gesetzt-sein.html)

hoika 22. Feb 2016 16:09

Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Hallo,

3 Variablen
Delphi-Quellcode:
var
  B1, B2, B3: Boolean;
  bOK: Boolean;
begin
  //
  bOK := ??
end;
bOK soll jetzt nur True sein, wenn nur einer der 3 Werte True ist.
Mein bisheriger Ansatz:

Delphi-Quellcode:
bOK := False;
if B1 then
begin
  bOK := True;
end;
if B2 then
begin
  if bOK then
  begin
    bOK := False;
    Exit;
  end;
  bOK := B2;
end;
if Be then
begin
usw.

Irgendwie ist heute Montag ...

Wie löst man das eleganter ???

Ich will nicht viele And's und Or's haben.

Delphi-Quellcode:
  if ((B1=True) and (B2=False) and (B3=False)) or
     ((B1=False) and (B2=True) and (B3=False)) or
     ((B1=False) and (B2=False) and (B3=True)) then
  begin
    bOK := True;
  end;
Naja, jetzt habe ich halt doch and's und or's ...


Heiko

Luckie 22. Feb 2016 16:17

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Mit einer OR Verknüpfung?

Delphi-Quellcode:
bOK := B1 or B2 or B3;

TiGü 22. Feb 2016 16:19

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Delphi-Quellcode:
bOK := B1 xor B2 xor B3;

Luckie 22. Feb 2016 16:39

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Warum XOR?

Ah ja. Stimmt. Hast Recht. Bei mir wäre bOK auch wahr, wenn zwei oder drei wahr wären, es darf aber nur einer wahr sein.

p80286 22. Feb 2016 16:43

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Delphi-Quellcode:
w:=0;
if B1 then inc(w,1);
if B2 then inc(w,1);
if B3 then inc(w,1);
bok:=W=1;
Gruß
K-H

hoika 22. Feb 2016 16:46

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Hallo,
ja, mit dem Inc und Hochzählen sieht elegant aus ;)
Da kommt man nach 17:00 nicht drauf ... ;)

Ah so: elegant und trotzdem leserlich sollte es sein.

Jetzt schmeisse ich mal den Profiler an und mal schaun, was am schnellsten bei 1.000.000 Vergleiche ist.


Danke


Heiko

SProske 22. Feb 2016 16:52

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Zitat:

Zitat von TiGü (Beitrag 1330995)
Delphi-Quellcode:
bOK := B1 xor B2 xor B3;

Ergibt für 3mal True wieder True ;)



Zitat:

Zitat von p80286 (Beitrag 1331003)
Delphi-Quellcode:
w:=0;
if B1 then inc(w,1);
if B2 then inc(w,1);
if B3 then inc(w,1);
bok:=W=1;
Gruß
K-H

Könnte man auch schreiben als

Delphi-Quellcode:
bOK := IfThen(B1, 1, 0) + IfThen(B2, 1, 0) + IfThen(B3, 1, 0) = 1;

p80286 22. Feb 2016 16:54

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Zitat:

Zitat von hoika (Beitrag 1331004)
Hallo,
ja, mit dem Inc und Hochzählen sieht elegant aus ;)
Da kommt man nach 17:00 nicht drauf ... ;)

Hmm, übersichtlich, ja als Array..
(Das XOR "gefällt" mir besser. -- Shit nicht zu ende gedacht)
(kommt wohl darauf an mit welchen Hilfskonstruktionen man zuerst gearbeitet hat)

Laß mal hören was effektiver ist.

Gruß
K-H

HeZa 22. Feb 2016 17:13

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Für den Datentype Boolean (WordBool ausgenommen) funktioniert folgendes:
Delphi-Quellcode:
bOk := Ord(b1) +Ord(b2) +Ord(b3) = 1
Ich ergänze:
Wenn man so etwas wie
Delphi-Quellcode:
b1 := Boolean(11);
macht wird es auch hässlich. :-)

Sir Rufo 22. Feb 2016 18:41

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Zitat:

Zitat von HeZa (Beitrag 1331014)
Für den Datentype Boolean (WordBool ausgenommen) funktioniert folgendes:
Delphi-Quellcode:
bOk := Ord(b1) +Ord(b2) +Ord(b3) = 1
Ich ergänze:
Wenn man so etwas wie
Delphi-Quellcode:
b1 := Boolean(11);
macht wird es auch hässlich. :-)

Korrekter wäre die Form
Delphi-Quellcode:
bOk := Ord( b1 ) + Ord( b2 ) + Ord( b3 ) = Ord( true );
:stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz