[erledigt] Stringzuweisung, String wird ungewollt länger

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
NoCee
Beiträge: 174
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

[erledigt] Stringzuweisung, String wird ungewollt länger

Beitrag von NoCee »

Hallo zusammen,

ich hab da ein Verständnisproblem mit strings.
In meinem Prog hab ich eine globale Variable mystring : string deklariert. Der Schalter für Strings steht auf H+
In einer TCP/IP Empfangsprocedure mach ich folgendes:
mystring := mystring + s wobei s auch ein string ist nur local deklariert.
Wenn eine Telegrammendesequenz empfangen wurde, wird der linke Teil bis einschließlich der Endesequenz
ausgegeben und der string anschließend bis einschließlich Endesequenz gelöscht. Da beim OnReceive ein Teil
vom nächsten Telegramm schon dabei sein kann, lösche ich nicht den gesammten string sondern nur
eine Teil: delete(mystring, 1, mylaenge). Meistens ist der string dann leer aber ab und zu stehen da noch ein paar Byte
die ich nach dem nächsten Telegrammempfang noch brauche. Im Windowstaskmanager zeigt er mir nun eine stetig
wachsenden Speicherbedarf von Anfangs 13MB bis ich neu starte bei über 100MB an.
Nach langem Suchen und rumprobieren hab ich den string zu einem shortstring mystring : string[255] gemacht.
Und seither alles prima. Sagen wir mal fast. Ich hätts nämlich gern auch kappiert. Klar ist mir nur warum es mit shortstring
geht: Wird nie länger als 255 und ist nach der Initialisierung bei formcreate permanent da.
Aber was passiert mit dem Nichtshortstring. Ich lösche doch immer den linken teil bis zur Endesequenz weg.

Für eine Erleuchtung bedanke ich mich schon mal im Vorraus
Gruß
NoCee
Zuletzt geändert von NoCee am Do 6. Feb 2014, 22:13, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Stringzuweisung, String wird ungewollt länger

Beitrag von theo »

Kannst du das mal auf ein nachvollziehbares Beispiel runterbrechen?

Du sagst also, dass so immer mehr Speicher verbraucht wird?

Code: Alles auswählen

var  S:String;  
...
  for i:=0 to 1000 do
  begin
   S:= S+StringOfChar('a',10000);
   Delete(S,1,Length(S));
  end;
...
 

NoCee
Beiträge: 174
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Stringzuweisung, String wird ungewollt länger

Beitrag von NoCee »

:oops:
ou mann ist das peinlich.
Mit dem Versuch ein Minimalbeispiel zu bekommen war ich stunden lang überhaupt nicht erfolgreich.
Allerdings ist mir aufgefallen, daß ich in meinem Programm nur 3 globale Variablen habe die das verursachen können.
Ich hab mir dann mit 3 zusätzlichen Editfelder bei jedem OnReceive vom TCP/IP die Variablenlänge aktuelle anzeigen lassen.
Ursache: Aus einer Altlast herraus wurde ein String eben nicht gelöscht.
Meine Abhilfe mit dem shortstring funktionierte halt wegen der endlichen Stringlänge.
Also Lazarus prima, ich blind.

Sorry für die Mühe theo
ohne deine Rückfrage nach einem kleinen Beispiel würde ich jetzt noch im Dunkeln tappen

Gruß und Dank
NoCee

Antworten