Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: "array-Einträge" nicht doppelt auslesen

  Alt 23. Mai 2006, 18:35
@TheAn00bis:
Da ein dynamisches Array immer bei null beginnt, kannst du das Low(...) auch durch 0 ersetzen, oder halt weglassen.

Warum das Array doppel kopieren?
es reicht doch, wenn die Daten nach dem zu entfernenden Eintrag um eine Position vorrücken ... also statt immer 200%-1 zu kopieren wird so durchschnittlich nur 50%-1 kopiert/verschoben ... und schneller geht es, wenn man alle nötigen Einträge auf einmal verschiebt (siehe Move)

Delphi-Quellcode:
procedure DeleteEntry(var pArray: Array of String; pPos: integer);
var i: integer;
begin
   for i := pPos to High(pArray) do
      pArray[i] := pArray[i + 1];
   SetLength(pArray, High(pArray));
end;

function ChoseRandomString: String;
var i:integer;
begin
   i := Random(Length(StringArray));
   Result := StringArray[i];
   DeleteEntry(StringArray, i);
end;
Hie mal die Variante mit Move.
Bei deiner For-Variante werdne ja im Grunde alle String 2-mal Kopiert (na ja, bei AnsiStrings werden nur die Refferenzzähler erhöht/verringert, aber bei anderen Stukturen, ohne Refferenzzählung, werden die Inhalte 2mal kopiert).
Delphi-Quellcode:
procedure DeleteEntry(var pArray: Array of String; pPos: integer);
begin
   // String löschen
   pArray[i] := '';
   // die zu nötigen StringPointer vorkopieren
   Move(@pArray[pPos + 1], @pArray[pPos], (High(pArray) - pPos) * SizeOf(Pointer));
   // letzen Pointer löschen ... dieser wurde ja eine Stelle vorkopiert
   Pointer(pArray[High(pArray)]) = nil; SetLength(pArray, High(pArray));
end;

// ich hove bei Move war es Source-Dest-Length und nicht Dest-Source-Length ._.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat