AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Große String-Liste out of Memory - Hilfe?
Thema durchsuchen
Ansicht
Themen-Optionen

Große String-Liste out of Memory - Hilfe?

Ein Thema von Pogoner · begonnen am 20. Apr 2014 · letzter Beitrag vom 23. Apr 2014
Antwort Antwort
Seite 7 von 7   « Erste     567   
Benutzerbild von stahli
stahli

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

AW: Große String-Liste out of Memory - Hilfe?

  Alt 22. Apr 2014, 23:25
Nur mal zum Verständnis ein Beispiel für Rekursion:

Delphi-Quellcode:
  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;
Eine Funktion ruft sich bei Rekursion selbst wieder auf.
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#62

AW: Große String-Liste out of Memory - Hilfe?

  Alt 22. Apr 2014, 23:30
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. 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:
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;
Die Goto NichtRekursiv ; ist sehr gefährlich. Du baust hier eine Endlosschleife in dein Programm rein. Zwar gibt es das Goto DasEnde ; als Ausgang, das kann man aber eleganter mit repeat lösen (meiner Meinung nach).

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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Große String-Liste out of Memory - Hilfe?

  Alt 23. Apr 2014, 02:22
Zitat:
//zum Test
Die anderen Variablen sollte man vielleicht auch initialisieren, aber darauf würde der Compiler eh hinweisen.
$2B or not $2B
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#64

AW: Große String-Liste out of Memory - Hilfe?

  Alt 23. Apr 2014, 09:01
Das hier
Delphi-Quellcode:
  
...

  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;
geht auch so:
Delphi-Quellcode:
  for i=0 to WC.ControlCount -1 do
     if WC.Controls[I] is TWinControl then
        SubOdInfo(TWinControl(WC.Controls[I]), ExcludeWC, CtrlOd, Deep);
Und dieser Code hier:
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;
Lässt sich doch einfach so schreiben:
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
          begin
            I := I + 1;
            if i = 27 then
            goto DasEnde;
          end
    end;

DasEnde:
   showmessage ('Ende');
end;
Aber Sinn ergibt das nicht, vor allen Dingen nicht die innerste Schleife. Ich glaube, hier sind einfach 4 verschachtelte For-Schleifen erwünscht
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 7   « Erste     567   

 

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:36 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