Entwickler-Ecke

Algorithmen, Optimierung und Assembler - SetLength / Array Result


SAiBOT - Do 01.05.08 16:52
Titel: SetLength / Array Result
Hier ist eine Funktion von mir die im Speicher Daten sucht!
Mein Problem ist das Result (Array of Pointer).
Bei jedem SetLength Befehl wird der Array geleert, dies habe ich über einen kleinen Umweg bewältigt, nur das gefällt mir nicht so richtig!
Ich komm einfach nicht drauf wie ich das best möglich mit dynamischen Arrays hinkriege, das nach dem aufrufen der Funktion Length u. Inhalt des Arrays korrekt sind.
Hier mein Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
type
  PointerArray = Array of Pointer;

function SearchInMemory(Source:Pointer; SourceLen:Integer;
  Data:Pointer; DataLen: Integer):PointerArray;
var
  SourceEnd,
  SourceStart: Integer;
  tmp: PointerArray;
  i:Integer;
begin
  SetLength(Result, 0);

  SourceStart := Integer(Source);
  SourceEnd := SourceStart + SourceLen - (DataLen - 1);

  while SourceStart < SourceEnd do
  begin
    if CompareMem(Pointer(SourceStart), Data, DataLen) then
    begin
      SetLength(tmp, Length(Result));
      tmp := result;

      SetLength(Result, Length(Result)+1);
      for i := 1 to Length(tmp) do
        Result[i] := tmp[i];  
      Result[Length(Result)] := Pointer(SourceStart);
      Inc(SourceStart, DataLen-1);
    end;
    inc(SourceStart);
  end;
end;


MfG


BenBE - Fr 02.05.08 18:46

Versuchs mal mit ReallocMem auf nen dynamisch mit GetMem geholten Speicherblock und kopier das Ergebnis erst am Ende in das Result-Array mit Move ...

Alternativ kannst Du auch einfach Spezialfähigkeit "korrektes Programmieren" benutzen und in Zeile 27

Delphi-Quelltext
1:
Result[Length(Result)] := Pointer(SourceStart);                    

durch

Delphi-Quelltext
1:
Result[High(Result)] := Pointer(SourceStart);                    

ersetzen :P

Klassischer Fall von Buffer Overflow :P


Kha - Fr 02.05.08 21:15

Bei so einer wachsenden Menge mit unbekannter Endgröße würde ich eher auf eine TList setzen. Add lässt sich erst gar nicht falsch indizieren :mrgreen: .

user profile iconBenBE hat folgendes geschrieben:
Spezialfähigkeit "korrektes Programmieren"
Und nicht den Kaffee-Buff vergessen, um den Cooldown gering zu halten ;) .