![]() |
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:
Gruß
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; Micha |
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; |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Ok, schon geändert.
Macht es eigentlich einen Unterschied ob man:
Delphi-Quellcode:
oder
procedure DeleteComments(TempList:TStringList);
Delphi-Quellcode:
procedure DeleteComments(var TempList:TStringList);
deklariert. Gruß Micha |
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.
|
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Alles klar und vielen Dank.
Aber woher könnte denn nun die Fehlermeldung kommen? |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Übergibst Du jetzt als const-Parameter?
|
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). |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Klingt logisch.
|
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Zitat:
|
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 19:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz