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: .
BenBE hat folgendes geschrieben: |
Spezialfähigkeit "korrektes Programmieren" |
Und nicht den Kaffee-Buff vergessen, um den Cooldown gering zu halten ;) .
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!