![]() |
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:
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?
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)) danke! |
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. |
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. |
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
|
Re: Problem bei logischer abfrage
Zitat:
|
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 |
Re: Problem bei logischer abfrage
Warum sollte er auch, es reicht ja das einer der beiden wahr ist.
|
Re: Problem bei logischer abfrage
also nochmal:
Delphi-Quellcode:
cardexistsnoco müsste bei allen 5 heart-abfragen true geben.. also nach dem schema müsste
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)) 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.. |
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:
- 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.
var a, b, c, d: Boolean;
{...} if (a and b) or (c and d) then //... - Wenn a true ist wird b überprüft, wenn b auch true ist, wird nichts mehr überprüft. |
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. |
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