AGB  ·  Datenschutz  ·  Impressum  







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

Delphi 6 -> Delphi 10.2

Ein Thema von Temi00 · begonnen am 4. Apr 2018 · letzter Beitrag vom 6. Apr 2018
Antwort Antwort
Seite 2 von 2     12   
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#11

AW: Delphi 6 -> Delphi 10.2

  Alt 5. Apr 2018, 16:01
Nein. Ein Nuller genügt beim AND. Nur T AND T is T. Ist bei OR nicht anders.

Geändert von MichaelT ( 5. Apr 2018 um 18:01 Uhr)
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: Delphi 6 -> Delphi 10.2

  Alt 5. Apr 2018, 16:13
Irrtum (meinerseits).


Geändert von MichaelT ( 5. Apr 2018 um 17:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von FaTaLGuiLLoTiNe
FaTaLGuiLLoTiNe

Registriert seit: 3. Jul 2004
Ort: NRW
55 Beiträge
 
Delphi XE Enterprise
 
#13

AW: Delphi 6 -> Delphi 10.2

  Alt 5. Apr 2018, 16:36


Bei der verkürzten Auswertung bricht der Programmfluss ab, sobald klar ist, dass der gesamte boolsche Ausdruck wahr ist.

Bei deinem Beispiel ist doch der erste Operand des or-Vergleichs False und er kann die Auswertung nicht abbrechen, weil er auf jeden Fall noch den zweiten Operand auswerten muss um zu sehen ob dieser den Gesamtausdruck wahr macht...
wenn der erste Vergleich stattdessen True ergeben würde, dann würde der zweite Vergleich nicht mehr durchgeführt werden.
Christian
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: Delphi 6 -> Delphi 10.2

  Alt 5. Apr 2018, 16:39
Hast du recht. Delphi bricht tatsächlich ab. Ich bin davon ausgegangen, dass das Pragma funktioniert. Da ließ ich mich verwirren. Sorry.



Bei der verkürzten Auswertung bricht der Programmfluss ab, sobald klar ist, dass der gesamte boolsche Ausdruck wahr ist.

Bei deinem Beispiel ist doch der erste Operand des or-Vergleichs False und er kann die Auswertung nicht abbrechen, weil er auf jeden Fall noch den zweiten Operand auswerten muss um zu sehen ob dieser den Gesamtausdruck wahr macht...
wenn der erste Vergleich stattdessen True ergeben würde, dann würde der zweite Vergleich nicht mehr durchgeführt werden.

Geändert von MichaelT ( 5. Apr 2018 um 16:57 Uhr)
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Delphi 6 -> Delphi 10.2

  Alt 5. Apr 2018, 17:21
Ich hatte keinen Clean gemacht. Deswegen war ich auch überrascht.

Wenn der besagte Fehler auftritt, dann müsste man mal in die Projektoptionen schauen. Und hernach Clean und Build, zumindest zur Vorsicht.

Ändert aber nix dran dass der Code ein wenig seltsam ist.



Bei der verkürzten Auswertung bricht der Programmfluss ab, sobald klar ist, dass der gesamte boolsche Ausdruck wahr ist.

Bei deinem Beispiel ist doch der erste Operand des or-Vergleichs False und er kann die Auswertung nicht abbrechen, weil er auf jeden Fall noch den zweiten Operand auswerten muss um zu sehen ob dieser den Gesamtausdruck wahr macht...
wenn der erste Vergleich stattdessen True ergeben würde, dann würde der zweite Vergleich nicht mehr durchgeführt werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#16

AW: Delphi 6 -> Delphi 10.2

  Alt 5. Apr 2018, 18:44
ist zwar off topic aber IMHO muss man beim AND immer beide Ausdrücke auswerten beim OR kann auch wegoptimiert werden. Unwahrscheinlich dass das bei Pascal anders war. Just my 2 cents
Nein.

Mit der standardmäßigen kurzen Auswertung:
Bei OR wird der zweite nur ausgewertet, wenn der erste FALSE ist
Bei AND wird der zweite nur ausgewertet, wenn der erste TURE ist

Ansonsten steht das Ergebnis ja schon fest und Delphi spart sich die weitere Auswertung.
false AND irgendwas = false
true OR irgendwas = true

Darum kann man in Delphi standardmäßig auch sowas machen
if Assigned(irgendwas) and irgendwas.wasanderes then Bei anderen Sprachen, die immer voll auswerten, oder wo die Auswertereihenfolge sich ändern kann, da geht das nicht.
z.B. in einigen DBMS (SQL), wo immer vollständig ausgewertet wird und wo der Queryplaner nach Gutdünken die Auswertung umdrehen kann.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Apr 2018 um 18:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Delphi 6 -> Delphi 10.2

  Alt 5. Apr 2018, 18:56
Im zitierten Text stand doch nichts anderes.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#18

AW: Delphi 6 -> Delphi 10.2

  Alt 5. Apr 2018, 21:14
Der Fehler sofern dieser dort auftritt kommt aber genau von der Abwesenheit der Kurzschlussauswertung. Wenn der Autor sonst nichts angegriffen hat.

Das war ein Reply auf meinen Irrtum, obwohl dieser auch nur teilweise zuschlug.

Ich hatte mich nur kurzfristig davon ablenken lassen, dass das Pragma nicht mehr funktioniert sondern die Einstellung auf das Projekt bezogen ist. Ich habe zwar dann geschnallt, dass die Pragmas offensichtlich überlesen werden, vermute ich zumindest, aber nicht regelmäßig einen Clean vor dem Build nach dem Umschalten der Projekt Settings.

Der Grund wäre der naheliegende. Stellt sich die Frage warum? Im Projekt global aufgedreht, da Projekt konvertiert - wäre möglich kann ich aber nicht testen.

Wenn dem nicht so wäre beleibt die Frage ob das Pragma {B+] doch irgendwie zieht wenn es im Quellcode steht. Wenn ja, dann muss jedes Element initialisiert gewesen sein. Sonst kann der Code nicht zu dem vermuteten Fehler passen.

Davon mal abgesehen

if (Current <> nil) and (Current.Character = Value) then ... War einfacher zu lesen. Result ist zu Beginn schon nil.


Bei einem neuen Projekt funktionierts es. Also bleibt nicht viel.

erweiterte Variante (abenteuerlich): Complete Boolean avail gelte hieße, dass immer ein initialisiertes Objekt vor gefunden wurde und die Value. Wäre das der Fall gewesen, dann müsste sich am Aufbau des Baums etwas geändert haben, resp. an der Quelle aus der dieser Baum wird erzeugt.

zum Code: Es genügte vollkommen in einer Schleife zu prüfen ob das Objekt initialisiert ist und drinnen einfach die Value abzufragen. Es wird allein beim ersten Auffinden einer Value die Schleife verlassen. Sauberer wäre eine Variable canContinue und wenn man den nächsten Nachfolger liest diese zu setzen in Abhängigkeit ob die Value gefunden wurde.


ist zwar off topic aber IMHO muss man beim AND immer beide Ausdrücke auswerten beim OR kann auch wegoptimiert werden. Unwahrscheinlich dass das bei Pascal anders war. Just my 2 cents
Nein.

Mit der standardmäßigen kurzen Auswertung:
Bei OR wird der zweite nur ausgewertet, wenn der erste FALSE ist
Bei AND wird der zweite nur ausgewertet, wenn der erste TURE ist

Ansonsten steht das Ergebnis ja schon fest und Delphi spart sich die weitere Auswertung.
false AND irgendwas = false
true OR irgendwas = true

Darum kann man in Delphi standardmäßig auch sowas machen
if Assigned(irgendwas) and irgendwas.wasanderes then Bei anderen Sprachen, die immer voll auswerten, oder wo die Auswertereihenfolge sich ändern kann, da geht das nicht.
z.B. in einigen DBMS (SQL), wo immer vollständig ausgewertet wird und wo der Queryplaner nach Gutdünken die Auswertung umdrehen kann.

Geändert von MichaelT ( 5. Apr 2018 um 21:41 Uhr)
  Mit Zitat antworten Zitat
Temi00

Registriert seit: 1. Aug 2004
9 Beiträge
 
#19

AW: Delphi 6 -> Delphi 10.2

  Alt 6. Apr 2018, 15:19
Der Fehler sofern dieser dort auftritt kommt aber genau von der Abwesenheit der Kurzschlussauswertung. Wenn der Autor sonst nichts angegriffen hat.

Ich hab jetzt in den Projekt Optionen einen Schalter gefunden "Complete Boolean Evaluation" Der war auf True. Komisch da im Internet steht default False;

Habe nun auf False gesetzt. make clean. Und nochmal mit debugger gestartet. Wieder die selbe Stelle. Das verstehe ich nun überhaupt nicht. Current ist ja nun defintiv nil und dann sollte der zweite Ausdruck ja nicht mehr geprüft werden.

habe dann kurz voher

{B-} eingefügt jetzt ist der Fehler an anderer Stelle
{B-} wieder entfernt Fehler bleibt an dieser anderen Stelle ???
Da ich ja den Source geändert habe dürfte ein make clean ja nicht nötig sein. Trotzdem clean aber der Fehler bleibt da (an dieser zweiten Stelle) Ich glaub ich schmeiss die Flinte ins Korn. Der externe soll nochmal ran. Ich brauch erst ein Kurs (Für Pascal und IDE)

Danke erst mal
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#20

AW: Delphi 6 -> Delphi 10.2

  Alt 6. Apr 2018, 21:35
Ich würde mal im Projekt die Einstellung auf False lassen. Die hast du vermutlich umgestellt.

Interessant bei mir reagiert der Compiler auf das Pragma nicht, auf die Project Settings schon. Ich bin unter Delphi 10.2 (pur).

Wir müssen die richtige Stelle finden an der dieser Fehler passiert. Also können wir nichts ausschließen. Schön wäre es gewesen.

Aus der Ferne kann ich nichts sagen und ich bin vermutlich ganz weit weg.

Frage: Wie weit weg von dieser Codestelle ist woanders?

Wenn dann müssten wir mit {B-} und {B+} den Bereich einschränken.

Aber zuvor gibt es noch die Einstellungen am Package selbst und nicht nur im Projekt. Aber plag ich nicht.


Der Fehler sofern dieser dort auftritt kommt aber genau von der Abwesenheit der Kurzschlussauswertung. Wenn der Autor sonst nichts angegriffen hat.

Ich hab jetzt in den Projekt Optionen einen Schalter gefunden "Complete Boolean Evaluation" Der war auf True. Komisch da im Internet steht default False;

Habe nun auf False gesetzt. make clean. Und nochmal mit debugger gestartet. Wieder die selbe Stelle. Das verstehe ich nun überhaupt nicht. Current ist ja nun defintiv nil und dann sollte der zweite Ausdruck ja nicht mehr geprüft werden.

habe dann kurz voher

{B-} eingefügt jetzt ist der Fehler an anderer Stelle
{B-} wieder entfernt Fehler bleibt an dieser anderen Stelle ???
Da ich ja den Source geändert habe dürfte ein make clean ja nicht nötig sein. Trotzdem clean aber der Fehler bleibt da (an dieser zweiten Stelle) Ich glaub ich schmeiss die Flinte ins Korn. Der externe soll nochmal ran. Ich brauch erst ein Kurs (Für Pascal und IDE)

Danke erst mal
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 12:11 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