Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehlermeldung "Zu wenig Arbeitsspeicher" (https://www.delphipraxis.net/118362-fehlermeldung-zu-wenig-arbeitsspeicher.html)

DerAndereMicha 6. Aug 2008 12:56


Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Hallo Zusammen,

in einer Funktion von mir, die dazu dient aus einer SQL-Anweisung (als Stringliste) alle Kommentare zu entfernen, tritt sporadisch der Fehler "Zu wenig Arbeitsspeicher" auf. Leider kann ich nicht nachvollziehen, wo und warum das geschieht. Evtl. hat einer von Euch ja mehr Überblick und sieht auf den 1.Blick, unter welchen Umständen das passieren könnte bzw. ob ich ansich einen schweren Fehler begehe (evl. die Übergabe der Stringliste?).

Delphi-Quellcode:
function DeleteComments(TempList:TStringList):TStringList;
var beg,en,i : integer;
begin
    for i:=0 to TempList.Count-1 do
       if Trim(Copy(TempList[i],1,2))='--' then
         TempList[i]:='/*'+Copy(TRIM(TempList[i]),3,Length(TempList[i]))+'*/';

    while pos('/*',TempList.Text) <> 0 do
    begin
      beg:=pos('/*',TempList.Text);
      en:=pos('*/',TempList.Text);
      if en=0 then en:=Length(TempList.Text);
      TempList.Text:=copy(TempList.text,1,beg-1)+
                     copy(TempList.Text,en+2,Length(TempList.Text));
    end;
    Result:=TempList;
end;
Gruß
Micha

Phoenix 6. Aug 2008 13:01

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Ich glaube nicht, dass es an der Übergabe liegt.
Aber warum gibst Du die Instanz von Templist zurück?
Wenn Du doch eh auf der Liste Veränderungen vornimmst, dann brauchst Du sie nicht zurückzugeben.

Delphi-Quellcode:
procedure Machwas;
var
 myListe: TStringList;
begin
  myListe := TStringList.Create();
  try
    // hier noch die liste füllen...


    // der Aufruf
    myListe := DeleteComments(myListe);

    // ist vollkommen identisch mit:
    DeleteComments(myListe);

  finally
    if Assigned(myListe) then
      FreeAndNil(myListe);
  end;
end;

DerAndereMicha 6. Aug 2008 13:09

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Ok, schon geändert.

Macht es eigentlich einen Unterschied ob man:

Delphi-Quellcode:
procedure DeleteComments(TempList:TStringList);
oder

Delphi-Quellcode:
procedure DeleteComments(var TempList:TStringList);

deklariert.

Gruß
Micha

DeddyH 6. Aug 2008 13:16

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Ja, denn bei der Übergabe als var kannst Du theoretisch sogar die Referenz ändern, d.h. wenn Du ListBox.Items übergibst, könntest Du auf ComboBox.Items referenzieren. Daher habe ich persönlich mir angewöhnt, Objektinstanzen immer als const-Parameter zu übergeben.

DerAndereMicha 6. Aug 2008 13:23

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Alles klar und vielen Dank.

Aber woher könnte denn nun die Fehlermeldung kommen?

DeddyH 6. Aug 2008 13:27

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Übergibst Du jetzt als const-Parameter?

Phoenix 6. Aug 2008 13:33

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Für mich gerade logische Erklärung:
Du benutzt ziemlich intensiv 'copy'. Das erzeugt eine String-Variable. Da Du das Ergebnis sofort verwendest und nirgends 'manuell' zwischenspeicherst, muss Delphi die Variable ja irgendwo hinpacken. Jedes einzelne Copy braucht also Speicher, der solange belegt wird, bis die Funktion beendet ist. (Kann auch sein, dass ich mich hier irre. Ich kenne die interna dafür nicht gut genug).

Möglicherweise hilft es, mit temporären Variablen zu arbeiten, und zuerst die Rückgabe von Copy dort abzulegen und dann erst dann zu vergleichen, als das in einem Schritt zu machen. Somit hat der Wert der aus Copy rauskommt einen genau definierten Platz im Speicher und überschreibt immer den vorherigen, anstelle neuen Platz zu benötigen (wie gesagt ohne Gewähr für die Richtigkeit meiner Annahme).

DeddyH 6. Aug 2008 13:35

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Klingt logisch.

Phoenix 6. Aug 2008 13:36

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Zitat:

Zitat von DeddyH
Klingt logisch.

Kann aber genausogut grottenverkehrt sein ;-)

DerAndereMicha 6. Aug 2008 13:36

Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
 
Ja, das hab ich geändert. Das Problem ist aber, daß der Fehler bei mir selbst sowieso noch nie aufgetreten ist; also nicht vor und auch nicht nach der jetzigen Änderung. Der Fehler tritt nur sporadisch (1-5 mal pro Monat) bei dem Benutzer der Software auf und so ist das schwierig herauszufinden, ob es was gebracht hat.

Du meinst aber also schon, daß es daran gelegen haben könnte?

Gruß
Micha


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.
Seite 1 von 4  1 23     Letzte »    

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