AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IF Abfrage

Ein Thema von Stillmatic · begonnen am 6. Jun 2007 · letzter Beitrag vom 7. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#1

IF Abfrage

  Alt 6. Jun 2007, 20:34
Kann mir einer von euch sagen warum bei dieser ID Abfrage immer nur der erste Fall geprüft wird??

Delphi-Quellcode:
       if (((Merkmal = ID) and (Temp1.ID < Temp2.ID))
      or ((Merkmal = N) and (Temp1.Name < Temp2.Name))
      or ((Merkmal = T) and (Temp1.Typ < Temp2.Typ))
      or ((Merkmal = K) and (Temp1.Kategorie < Temp2.Kategorie)))then
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: IF Abfrage

  Alt 6. Jun 2007, 20:38
Es gibt ein so genanntes Kurzschlussverfahren. Ich verweise hier einfach mal auf dsdt.

Wird falsch ausgewertet? Inwiefern?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#3

Re: IF Abfrage

  Alt 6. Jun 2007, 20:52
Ahhh, ich verstehe!!

Ist mir so noch nie passiert, Komisch!

Aber mein Problem ist das ich diese Abfrage machen muss,da er bei allen Fällen das selbe ausführen muss, aber ich will doppelten Code vermeiden!!

Wie könnte man es denn noch machen??
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: IF Abfrage

  Alt 6. Jun 2007, 20:58
Du hast noch nicht gesagt, was dein eigentliches Problem ist . Anscheinend wird falsch ausgewertet. Was?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#5

Re: IF Abfrage

  Alt 6. Jun 2007, 21:05
Zitat:
Kann mir einer von euch sagen warum bei dieser ID Abfrage immer nur der erste Fall geprüft wird??
wenn der erste fall bereits true ergibt, dann werden die weiteren fälle erst gar nicht geprüft.
für mich sieht das logisch aus. sehe da kein problem.

oder möchtest du das ALLE bedingungen erfüllt werden sollen?
dann muss das so aussehen:
Delphi-Quellcode:
if (((Merkmal = ID) and (Temp1.ID < Temp2.ID))
      and ((Merkmal = N) and (Temp1.Name < Temp2.Name))
      and ((Merkmal = T) and (Temp1.Typ < Temp2.Typ))
      and ((Merkmal = K) and (Temp1.Kategorie < Temp2.Kategorie)))then
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#6

Re: IF Abfrage

  Alt 6. Jun 2007, 21:12
Nein Nein!

Mein Problem ist das Irgendetwas mit der Abfrage nicht stimmt!

Ich will das der erste Fall geprüft wird, wenn er Treu ergibt tue irgendetwas, wenn er False ergibt prüfe die nächste Bedingung!!

Also im Klartext....

if ((Merkmal = ID) and (Temp1.ID < Temp2.ID)) ---> false dann Prüfe nächste Bedingung
or ((Merkmal = N) and (Temp1.Name < Temp2.Name)) ---> false dann Prüfe nächste Bedingung
or ((Merkmal = T) and (Temp1.Typ < Temp2.Typ)) ---> true dann führe Then Teil durch!
or ((Merkmal = K) and (Temp1.Kategorie < Temp2.Kategorie))then

Das Problem besteht genau darin, das wenn ich auf einen Button drücke wird Merkmal(z.B T)!
Dann geht er in die Bedingung rein und prüft den ersten Fall, wenn der False ist werden die anderen Fälle erst garnicht geprüft,
weil Delphi mit dem Kurzschlussverfahren arbeitet!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: IF Abfrage

  Alt 6. Jun 2007, 21:26
Soweit ich weis kürz dieses Verfahren nur bereits sichere Vergleiche ab

Wenn das Programm also gerade da ist: if (Falso and ...) then und die ... auswerten soll (das davor wurde vorher als False ausgewertet) dann überspringt er das weil es ja nicht mehr True geben kann - es ist logisch unmöglich. Das Gleich passiert bei if aor b then - wenn a bereits True gibt wird b nicht mehr ausgewertet.

Und glaube mir, der Kompiler macht da keinen fehler, das wäre anderen schon vorher aufgefallen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: IF Abfrage

  Alt 6. Jun 2007, 22:04
wie bereits erwähnt macht der compiler da keinen fehler. Wie kommst du darauf das der Compiler nicht weiter prüft?
Ich hoffe du gehst nicht davon aus das durh deinen Zeilenumbruch für jede Zeile ein Haltepunkt möglich ist und du es daran fest machst. Pro If kannst du nur einen Haltepunkt setzen. Nutze einfach den Debugger um festzustellen wo etwas nicht klappt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#9

Re: IF Abfrage

  Alt 6. Jun 2007, 22:07
Aber wie soll ich denn dann eine Abfrage Programmieren die 8 Bedingungen verknüpft mit and und or??

Also so gesehen 4 Bedingungen mit or verknüpft die im then-Teil alle das gleiche machen sollen!

Ja. Ich könnte jede Abfrage einzeln schreiben mit dem dazugehörigen then Teil, doch dann hätte ich ja jede Menge doppelten code!
(Nein, ich kann den then-Teil nicht in eine extra Procedure / Funktion setzen)!!

@SirThornberry
Ich behaupte ja auch nicht das der Compiler schuld ist, ich suche nur nach einer Lösung die sich meiner ähnelt und doppelten Code meidet!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: IF Abfrage

  Alt 6. Jun 2007, 22:13
am besten den Debugger bemühen, schauen welchen Wert die Variablen haben und auch die WatchList kann dir helfen. Wenn du einen Haltepunkt setzt kannst du ja einfach mal den Teilausdruck markieren welcher deiner Meinung nach True ergibt und dann die Maus über das markierte halten und schauen was wirklich raus kommt.

Vielleicht liegt dein Denkfehler aber auch bei: Temp1.Name < Temp2.Name
Du weißt schon das '9' größer ist als '10' oder?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.
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