AGB  ·  Datenschutz  ·  Impressum  







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

StackReturn

Ein Thema von stahli · begonnen am 26. Feb 2021 · letzter Beitrag vom 1. Mär 2021
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#1

StackReturn

  Alt 26. Feb 2021, 18:38
Hallo zusammen,

mal eine grundsätzliche Frage:

Ich habe verschachtelte Objekte, die rekursiv durchgearbeitet werden. Unter bestimmten Umständen muss ich die Rekursion abbrechen (also sofort aus der aktuellen Methode raus) und einige Ebenen höher weiter machen. Quasi also im Aufrufstack an eine bestimmte Stelle zurück springen.

Aktuell ermittle ich einen höher liegenden "Interessenten", der von den tieferen Objekten (über eine Owner-Kette) seine Zuständigkeit erklärt.
Die tieferen Objekte haben somit ihre Arbeit einzustellen, biss der "Interessent" weiter machen kann.

Dieses "Interessentenobjekt" wird aktuell in einer globalen Variable verwaltet.
Ist dieses definiert und das aktuelle Objekt nicht diesen "Interessenten-Objekt", muss es seine Methode verlassen.

Das funktioniert, aber gibt es eine bessere/elegantere Lösung?
Ich hatte irgendwie zunächst an Callbacks o.ä. gedacht, aber so richtig komme ich da gedanklich nicht klar.
Aktuell sehe ich keine bessere Lösung als den Abgleich mit einer "Interessenten-Instanz" und Exit aus den Methoden.


(Dass man diese Interessenteninstanz als Parameter weiter geben könnte, weiß ich. Das soll nicht das Problem sein.)


Anbei mal ein kleines Testprojekt.
(Kaspersky hatte die Exe mal bemeckert bei mir.)
Miniaturansicht angehängter Grafiken
26-02-_2021_19-21-34.png  
Angehängte Dateien
Dateityp: zip StackReturn.zip (414,4 KB, 3x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#2

AW: StackReturn

  Alt 27. Feb 2021, 12:37
Aktuell ermittle ich einen höher liegenden "Interessenten", der von den tieferen Objekten (über eine Owner-Kette) seine Zuständigkeit erklärt.
In dem Beispiel bestimmt die Instanz #7 dass die #3 der Interessent ist und nicht die #3 selbst. Ist das jetzt so gewollt, oder könnte die #3 auch unabhängig von der #7 dies tun? Das Beispiel ist halt sehr abstrakt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: StackReturn

  Alt 27. Feb 2021, 12:49
Nein, Instanz #7 weiß nicht ob und wer sich meldet.
Anders gesagt, jede Instanz kann nach oben anfragen, ob sich irgendein Interessent findet (könnte auch zufallsbasiert sein).
Das Ganze läuft recht dynamisch ab.

Stimmt, das war etwas zu sehr vereinfacht.

Aber inzwischen bin ich auch überzeugt, dass es keine bessere Lösung gibt, als eine globale oder Parameter-Instanz zu verwenden.
Im Grunde bräuchte ich sonst so etwas wie einen Rücksprungpunkt im Stacktrace (ähnlich einem Haltepunkt), wobei dann aber alle zwischenliegenden Methoden sofort verlassen werden, bis der Rücksprungpunkt erreicht ist.
Das wird so nicht möglich sein und meine umgesetzte Lösung funktioniert ja auch sehr gut. Ich muss eben nur jeweils auf eine definierte Interessenteninstanz prüfen und ggf. mit Exit die Methode verlassen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: StackReturn

  Alt 27. Feb 2021, 12:50
Statt rekursiv könntest du auch iterativ arbeiten, dann ist ein Umschalten viel einfacher, da man direkt springen kann, ohne alle Zwischenstation durchlaufen zu müssen.

Es gibt sogar ein Delphi-Referenz durchsuchenTStack<T>, was man nutzen könnte.
(oder Delphi-Referenz durchsuchenTQueue<T>, jenachdem wie rum gefüllt/verarbeitet wird ... FIFO/LIFO)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Feb 2021 um 12:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: StackReturn

  Alt 27. Feb 2021, 21:55
@himitsu

Danke, aber das wird für mich nicht passen.
Ich parse Code und baue den um (das wird nochmal ein neuer, effektiverer Ansatz für meinen Optimizer).
Der Ablauf soll dann nicht von außen gesteuert werden sondern sich durch die Logik der einzelnen Klassen ergeben.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: StackReturn

  Alt 27. Feb 2021, 22:23
Parsen lassen könntest'e Code aber auch durch LSP?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: StackReturn

  Alt 27. Feb 2021, 22:33
Ich will ihn komplett umbauen und formatieren. Da komme ich wohl nur auf meinem Weg richtig mit klar.

Für ein evtl. späteres Umbenennen bestehender Variablen/Methoden könnte es natürlich nützlich sein.
Muss ich dann mal schauen, ob ich damit dann zurecht komme...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: StackReturn

  Alt 27. Feb 2021, 22:51
Es gibt zwei EXEn im BIN-Verzeichns.

Die Eine macht ObjectiveC zu Delphi (nutzt Emba zum Übersetzen von MacOS-Headern, um damit auf iOS/MacOS zuzugreifen)
und die Andere macht Delphi zu C.

Wenn ich das richtig verstanden hab dann kann man sich via LSP einen Code von Delphi oder C in einen Objektbaum übersetzen lassen.
Praktisch so ähnlich, wie gewisse XML-Klassen es mit einer XML-Datei machen.
Den Baum kannst dann durchgehn, ignorierst einfach alles, was dich nicht interessiert, und schon hast auch keine Probleme, wenn die Delphi-Language mal wieder neue Features bekommt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: StackReturn

  Alt 27. Feb 2021, 23:12
Wenn ich aber XML parsen muss, habe ich nicht viel gewonnen.

Im Prinzip habe ich Schlüsselwörter definiert und zu jedem Schlüsselwort ein Parse-Objekt.
Das prüft dann alles ab, in welchem Kontext es steht, ob es sich für irgend etwas überhaupt zuständig fühlt, wie es seinen Inhalt formatieren muss usw.

Zunächst wird eine Stringlist in einzelne Wörter zerlegt und diese werden in einer Liste gesammelt.
Dann starte ich das Parsing von einem TUnitFile-Objekt aus, dem die Liste mit Startpunkt 0 übergeben wird.
Der Rest geht dann automatisch. Ich muss halt die Regeln nur in den Parsing-Klassen verpacken.

Worte, die keinem Schlüsselwort entsprechen oder im Kontext nicht passen, bleiben einfacher Text.
Ob der Code insgesamt konkret gültig ist, muss ich ja nicht prüfen. Mich interessieren nur einige Teile und z.B. ob Begin-End-Blöcke korrekt aufgehen.

Das heißt, neue Sprachfeatures sollten i.d.R. unschädlich bzw. in einfacher Weise noch nachträglich zu berücksichtigen sein.
Ich war ja schon sehr weit, will aber jetzt nochmal ein paar Dinge optimieren.

Im Bild sieht man unter dem Mauszeiger eine erkannte Interface-Deklaration.(Man sieht, dass das "end;" dann auch wieder als eigenständige Anweisung erkannt wurde.)
Aus dem "prop" wird jetzt als nächstes ein komplettes Property mit Getter und Setter erzeugt.
Macht richtig Spaß jetzt.
Miniaturansicht angehängter Grafiken
27-02-_2021_23-55-54.png  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: StackReturn

  Alt 1. Mär 2021, 13:40
Statt rekursiv könntest du auch iterativ arbeiten, dann ist ein Umschalten viel einfacher, da man direkt springen kann, ohne alle Zwischenstation durchlaufen zu müssen.

Es gibt sogar ein Delphi-Referenz durchsuchenTStack<T>, was man nutzen könnte.
(oder Delphi-Referenz durchsuchenTQueue<T>, jenachdem wie rum gefüllt/verarbeitet wird ... FIFO/LIFO)
Jetzt muss ich mir das doch nochmal anschauen, aber aus einem etwas anderen Grund.

Ich will ja auch auskommentierten Text als Code interpretieren und die entsprechend auch kontextbezogen.
Das heißt, ich muss so etwas wie Branches organisieren.
Wenn ich in einen auskommentierten Block laufe, kann der irgendwann unabgeschlossen enden oder sogar ein "end." enthalten, was die Unit beenden würde.
Der hinter dem Block stehende echte Code, sieht aber ganz anders aus.

Insofern habe ich zwei völlig unterschiedliche Wege, die sich an einem bestimmten Punkt verzweigen, sich aber auf den gleichen vorherigen Kontext beziehen.

Also werde ich die verschachtelte Struktur beibehalten, aber dann mit "Iteratoren" arbeiten, die sich durch die Struktur bewegen können, und den jeweiligen Kontext beinhalten.
Das Rückspringen wird dadurch (wie Du geschrieben hast) tatsächlich einfacher und ich kann für auskommentierte Blöcke einfach eine Iteratorkopie erzeugen und sich diese bis zum Ende des auskommentierten Blockes durchwühlen lassen.
Insgesamt wird das aber schon auswendiger als der bisherige rekursive Ansatz. Nur mit dem kann ich "Abzweigungen an beliebigen Stellen" wieder schlechter umsetzen.

Ich hatte die Aufgabe zwar schon mal weitestgehend in einer verwalteten Liste umgesetzt (ohne Verschachtelungen), das war aber sehr aufwendig und hat eine Vielzahl an Sonderfällen ergeben, die zu berücksichtigen waren, so dass ich den neuen Ansatz nochmal versuchen wollte.

Mal sehen, um das jetzt mit einem Iterator besser funktioniert...

(Wie gesagt, ohne die "Kommentarbereich-Branches" könnte ich jetzt schon gut der Rekursion arbeiten.)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:13 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