AW: Große String-Liste out of Memory - Hilfe?
Nur mal zum Verständnis ein Beispiel für Rekursion:
Delphi-Quellcode:
Eine Funktion ruft sich bei Rekursion selbst wieder auf.
procedure SubOdInfo(WC, ExcludeWC: TWinControl; CtrlOd: Tod; var Deep: Integer); // diese Funktion ruft sich evtl. selbst wieder auf
var I: Integer; SC: TControl; SWC: TWinControl; function DataSetInfoOd(C: TComponent; CtrlOd: Tod): Boolean; begin Result := False; ... end; begin Inc(Deep); if (WC = ExcludeWC) or not DataSetInfoOd(WC, CtrlOd) then begin I := 0; while I <= WC.ControlCount - 1 do begin SC := WC.Controls[I]; if SC is TWinControl then begin SWC := (SC as TWinControl); SubOdInfo(SWC, ExcludeWC, CtrlOd, Deep); // hier rekursiver Aufruf end; Inc(I); end; end; Dec(Deep); end; Man hat dadurch mehrere Ebenen (hier in Deep nachvollziehbar) der Aufrufe, die dann wieder rückläufig verlassen werden. Das kann nützlich sein, wenn man bei einem durch eine Funktion gefundenen Ergebnis die gleiche Aktion wieder durchführen will. Jeder Durchgang hat seine eignen lokalen Variablen (z.B. I: Integer), die nach Beendigung des Durchlaufs wieder freigegeben werden. Wurden 100 Rekursionen ausgeführt wurde Deep bis 100 gezählt und wieder zurück und es wurden 100 mal die Variable I erzeugt und wieder freigegeben. |
AW: Große String-Liste out of Memory - Hilfe?
Als erstes möchte ich dir mal meine Bewunderung aussprechen. Ich bewundere Menschen die sich im Chaos zurecht finden. In dem Fall meine ich die unterschiedliche Tiefeinanordnung von Programmzeilen die zusammengehören. Da ist das Begin ein Tab tief, das dazugehörige End später fünf Tabs tief. Im Nachhinein zu wissen, dass beides zusammen gehört, erfordert ausgeprägtes abstraktes Denken. 8-) Das aber nur so nebenbei.
Nochmal zu Goto. Vergiss es. Mir fällt nichts ein wo man Goto benötigt. Ich kenne aber das Problem, denn auch ich hab mit Goto angefangen und brauchte den Klick im Kopf um mich davon zu verabschieden. Früher als es keine Prozeduren gab, konnte man vielleicht nicht anders, aber selbst früher konnte man innerhalb eines Blocks drauf verzichten. Hier zuerst dein Code, leicht abgepasst zum Testen in einer Prozedur:
Delphi-Quellcode:
Die
var
I, I2, I3, I4: Integer; npw: String; label NichtRekursiv, DasEnde; begin I4 := 0; //zum Test NichtRekursiv: //npw:= astring[I]+bstring[I2]+cstring[I3]+dstring[I4] ; I4 := I4 + 1; npw := IntToStr(I4); //als Ersatz If I4 = 11 then begin I3 := I3+1 ; I4 := 1 ; end; If I3 = 27 then begin I2 := I2+1; I3 := 1; end; If I2 = 11 then begin I := I+1; I2 := 1; end; If (I = 27) then begin Goto DasEnde ; end; showmessage (npw); Goto NichtRekursiv ; DasEnde: showmessage ('Ende'); end;
Delphi-Quellcode:
ist sehr gefährlich. Du baust hier eine Endlosschleife in dein Programm rein. Zwar gibt es das
Goto NichtRekursiv ;
Delphi-Quellcode:
als Ausgang, das kann man aber eleganter mit repeat lösen (meiner Meinung nach).
Goto DasEnde ;
Hier etwas vergleichbares, aber mit repeat.
Delphi-Quellcode:
var
I, I2, I3, I4: Integer; npw: String; begin I4 := 0; //zum Test repeat I4 := I4 + 1; npw := IntToStr(I4); //als Ersatz If I4 = 11 then begin I3 := I3+1 ; I4 := 1 ; end; If I3 = 27 then begin I2 := I2+1; I3 := 1; end; If I2 = 11 then begin I := I+1; I2 := 1; end; //showmessage (npw); until I = 27; showmessage ('Ende'); end; |
AW: Große String-Liste out of Memory - Hilfe?
Zitat:
|
AW: Große String-Liste out of Memory - Hilfe?
Das hier
Delphi-Quellcode:
geht auch so:... I := 0; while I <= WC.ControlCount - 1 do begin SC := WC.Controls[I]; if SC is TWinControl then begin SWC := (SC as TWinControl); SubOdInfo(SWC, ExcludeWC, CtrlOd, Deep); // hier rekursiver Aufruf end; Inc(I); end;
Delphi-Quellcode:
Und dieser Code hier:
for i=0 to WC.ControlCount -1 do
if WC.Controls[I] is TWinControl then SubOdInfo(TWinControl(WC.Controls[I]), ExcludeWC, CtrlOd, Deep);
Delphi-Quellcode:
Lässt sich doch einfach so schreiben:
var
I, I2, I3, I4: Integer; npw: String; begin I4 := 0; //zum Test repeat I4 := I4 + 1; npw := IntToStr(I4); //als Ersatz If I4 = 11 then begin I3 := I3+1 ; I4 := 1 ; end; If I3 = 27 then begin I2 := I2+1; I3 := 1; end; If I2 = 11 then begin I := I+1; I2 := 1; end; //showmessage (npw); until I = 27; showmessage ('Ende'); end;
Delphi-Quellcode:
Aber Sinn ergibt das nicht, vor allen Dingen nicht die innerste Schleife. Ich glaube, hier sind einfach 4 verschachtelte For-Schleifen erwünscht
var
I, I2, I3, I4: Integer; npw: String; begin for i4 := 1 to 10 do begin npw := IntToStr(I4); //als Ersatz for i3 := 1 to 26 do for i2 := 1 to 10 do begin I := I + 1; if i = 27 then goto DasEnde; end end; DasEnde: showmessage ('Ende'); end;
Delphi-Quellcode:
var
I, I2, I3, I4: Integer; npw: String; begin for i4 := 1 to 10 do begin npw := IntToStr(I4); //als Ersatz for i3 := 1 to 26 do for i2 := 1 to 10 do for i:=1 to 26 do begin // Hier sollte etwas mit i,i2,i3 und i4 passieren end; end; showmessage ('Ende'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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