Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei logischer abfrage (https://www.delphipraxis.net/82269-problem-bei-logischer-abfrage.html)

richie_k 9. Dez 2006 23:12


Problem bei logischer abfrage
 
Hallo!
Ich wusste nicht, was ich bei der Suche hätte eingeben sollen (also bei "logisches problem" hab ich nix dolles gefunden zB)
Naja mein Problem ist folgendes:
Delphi-Quellcode:
  if
  (cardexistsnoco(14,Club)AND
   cardexistsnoco(2,Club) AND
   cardexistsnoco(3,Club) AND
   cardexistsnoco(4,Club) AND
   cardexistsnoco(5,Club))
  or
  (cardexistsnoco(14,Heart)AND
   cardexistsnoco(2,Heart) AND
   cardexistsnoco(3,Heart) AND
   cardexistsnoco(4,Heart) AND
   cardexistsnoco(5,Heart))
cardexistsnoco ist eine funktion, die true oder false liefert.. ich habe zur überprüfung ein Showmessage in diese Funktion geschrieben.. er kontrolliert nur 14,Club und 14, Heart.. den Rest läuft er leider garnicht durch. Liegts an meinem Quelltext? (ja) was muss ich anders machen?
danke!

Muetze1 9. Dez 2006 23:27

Re: Problem bei logischer abfrage
 
Nein, das ist eine Optimierung. Du hast ja definiert, dass alle Dinger ein True zurück liefern müssen um die Gesamtbedingung zu erfüllen. Warum sollte er also noch die anderen Dinge abprüfen, wenn schon der erste Aufruf False gibt? Dadurch kann er die Bedingung eh nicht mehr erfüllen.

Du kannst in den Projektoptionen unter Compiler die Komplette Boolean Evaluation einschalten, aber im Normalfall ist diese aus.

Martin K 9. Dez 2006 23:32

Re: Problem bei logischer abfrage
 
Wenn cardexistsnoco(14,Club) false ergibt (so wird es hier wohl sein), werden die restlichen mit AND verknüpften Ausdrücke gar nicht erst überprüft, um die Geschwindigkeit zu optimieren (kann man imho irgendwo in den Compiler-Optionen auch abschalten, ist aber sinnlos).
Dasselbe gilt für cardexistsnoco(14,Heart).
Wenn diese beiden Audrücke schon false sind, kann ja die ganze IF-Abfrage auch nur false ergeben.

richie_k 9. Dez 2006 23:37

Re: Problem bei logischer abfrage
 
okay hätte ich dazu sagen müssen.. er gibt nach dem ersten true zurück.. also im prinzip müsste er so wie ich die Werte eingestellt habe auch überall im ersten true wiedergeben.. aber das zweite kommt eben garnicht erst zum aufruf

Muetze1 9. Dez 2006 23:44

Re: Problem bei logischer abfrage
 
Zitat:

Zitat von richie_k
okay hätte ich dazu sagen müssen.. er gibt nach dem ersten true zurück.. also im prinzip müsste er so wie ich die Werte eingestellt habe auch überall im ersten true wiedergeben.. aber das zweite kommt eben garnicht erst zum aufruf

Dann glaube ich einfach nicht, dass er true zurück gibt.

richie_k 9. Dez 2006 23:51

Re: Problem bei logischer abfrage
 
also hab jetzt ein showmessage an den anfang der noco funktion gemacht und bei erfolg auch noch eins.. ich bekomme jetzt

14
14
14=14

zurück..
sprich das mit club gibt false und das mit heart gibt true zurück.. er macht aber nich weiter

mkinzler 9. Dez 2006 23:52

Re: Problem bei logischer abfrage
 
Warum sollte er auch, es reicht ja das einer der beiden wahr ist.

richie_k 9. Dez 2006 23:55

Re: Problem bei logischer abfrage
 
also nochmal:
Delphi-Quellcode:
if
  (cardexistsnoco(14,Club)AND
   cardexistsnoco(2,Club) AND
   cardexistsnoco(3,Club) AND
   cardexistsnoco(4,Club) AND
   cardexistsnoco(5,Club))
  or
  (cardexistsnoco(14,Heart)AND
   cardexistsnoco(2,Heart) AND
   cardexistsnoco(3,Heart) AND
   cardexistsnoco(4,Heart) AND
   cardexistsnoco(5,Heart))
cardexistsnoco müsste bei allen 5 heart-abfragen true geben.. also nach dem schema müsste

14
14
14=14
2
2=2
3
3=3
4
4=4
5
5=5


zurückgegeben werden.. aber wie gesagt hört er nach 14=14 auf..

Martin K 9. Dez 2006 23:58

Re: Problem bei logischer abfrage
 
Wenn cardexistsnoco(14,Club) false ergibt, geht die Überprüfung mit cardexistsnoco(14,Heart) weiter.
Ergibt dies true, müsste als nächstes cardexistsnoco(2,Heart) überprüft werden.

Ich mache mal ein vereinfachtes Beispiel:
Delphi-Quellcode:
var a, b, c, d: Boolean;
{...}

  if (a and b) or (c and d) then
  //...
- Wenn a false ist, wird als nächstes c überprüft. Ist c true, wird d überprüft, wenn c false ist, wird nichts mehr überprüft.
- Wenn a true ist wird b überprüft, wenn b auch true ist, wird nichts mehr überprüft.

richie_k 10. Dez 2006 00:01

Re: Problem bei logischer abfrage
 
und genau das passiert hier leider nicht und ich verstehe nicht warum.. wie gesagt bei club wird nur das erste überprüft - gibt false zurück und wird in ruhe gelassen.. dann kommt das heart dran. es kommt true zurück, aber die zweite abfrage wird nicht mehr überprüft, was sie aber eigentlich werden müsste.
das ist ja gerade das problem ;)

das einzige was ich mir logisch vorstellen kann ist, dass die funktion eigentlich immer false zurückliefert, obwohl sie da deutlich als true deklariert wurde.. oder wie schreibt man das auf, dass die funktion dann true werden soll? (also innerhalb der funktion)

namederfunktion:=true;

oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.
Seite 1 von 3  1 23      

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