Zitat von
shmia:
Falsch:
Delphi-Quellcode:
SetLength(tempcookies, Length(tempcookies) + 1);
// nach SetLength ändert sich ja auch das Ergebnis von Length(tempcookies)
tempcookies[Length(tempcookies)] := CreateMozCookie(Cookies.Strings[Line]);
Richtig:
Delphi-Quellcode:
len := Length(tempcookies)
SetLength(tempcookies, len + 1);
tempcookies[len] := CreateMozCookie(Cookies.Strings[Line]);
Hi,
das len sollte durch Compileroptimierung eher überflüssig sein (behaupte ich einfach mal).
An sich gilt für dyn. Arrays immer, dass die null indexiert sind, also der erste Wert an der Stelle 0 steht und der letzte an der Stelle length(Array) - 1. Du kannst aber auch einfach low und high verwenden.
Arrays um ein Element zu vergrößern ist immer gaaanz schlecht. Ist zwar durchaus möglich, aber dabei wird der Speicher für das neue Array reserviert, das alte Array dort rein kopiert und dann das alte Array frei gegeben. Das ganze sind die Kosten für ein weiteres Element. Kommt ein zweites hinzu, musst du wieder diese Schritte vornehmen.
Besser ist es da, wenn du das Array gleich um mehr als ein Element vergrößerst. Der Zeitbedarf für das allozieren von Speicher und dem kopieren eines Arrays ist für eine große Anzahl von Elementen nahezu gleich dem Zeitaufwand für ein Element. Allozierst du aber gleich den Speicher für 100 Elemente, so sind die Kosten pro neuem Element nur noch bei einem 100stel der Kosten für nur ein Element. Hundert ist dabei keineswegs die optimale zahl.
In einem der (noch recht aktuellen) Threads wurde von alzaimar (u.A.!) gesagt, dass die Verdopplung der größe ein recht guter Wert ist. Du musst dir dann halt nur in einer weiteren Variable den Index des tatsächlich letzten verwendeten Elements merken.
Alternativ kannst du auch eine TList einsetzen, die macht intern fast das gleiche (nur eben nicht verdoppeln). Eine TList wächst dabei dyn., verwendet zwar auch ein Array, aber das bleibt für dich transparent.
Gruß Der Unwissende