Entwickler-Ecke
Sonstiges (Delphi) - Speicherblöcke zusammenfügen
sky21 - Di 17.03.09 17:11
Titel: Speicherblöcke zusammenfügen
Hi all
Ich muss z.B. 10 Speicherblöcke zu einem neuen zusammenfügen, bevor die Weiterverarbeitung gestartet werden kann. Ich habe zwar eine gebastelte Lösung erarbeitet, hoffe allerdings, dass jemand eine bessere Idee als ich hab' ...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TMyClass.Add(pData : Pointer; size : Integer); begin if (FSize = (10 * size ) then begin processLargeBlock(FpData, 10*size) FSize := 0; end else begin end;
end; |
Meine Superlösung wäre, dass ich zwei mal eine Move()-Operation ausführe. Das Problem, eine variable vom Typ pointer kann nicht indexiert werden, wobei die Zweite Move() Operation natürlich nicht ohne weiteres funktioniert
Delphi-Quelltext
1: 2:
| Move(src1^, dst^, len1); Move(src2^, dst[len1], len2); |
Daher muss 'dst' noch in ein PByteArray gecastet werden, wobei das Array endlich ist.
Delphi-Quelltext
1: 2: 3:
| Move(src1^, dst^, len1); ba := PByteArray(dst); Move(src2^, ba[len1], len2); |
Das ist wahrlich keine Elegante Lösung. Wer kann es besser? Danke für eure Vorschläge!
BenBE - Do 19.03.09 12:30
Wenn deine Datenstruktur immer gleich groß ist, arbeite mit einem Array[0..0] of Datentyp zum indizieren und schreib da dann immer ein @ davor.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TFoo = array[0..0] of TBar; PFoo = ^TFoo;
var Src1, Src2: TBar; DstMem: Pointer; Dst: PFoo;
Begin Dst := DstMem; Move(Src1, Dst^[0], SizeOf(Src1)); Move(Src2, Dst^[1], SizeOf(Src2)); end; |
Reinhard Kern - Do 19.03.09 15:35
BenBE hat folgendes geschrieben : |
Wenn deine Datenstruktur immer gleich groß ist, arbeite mit einem Array[0..0] of Datentyp zum indizieren und schreib da dann immer ein @ davor.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TFoo = array[0..0] of TBar; PFoo = ^TFoo;
var Src1, Src2: TBar; DstMem: Pointer; Dst: PFoo;
Begin Dst := DstMem; Move(Src1, Dst^[0], SizeOf(Src1)); Move(Src2, Dst^[1], SizeOf(Src2)); end; | |
Hi,
ich schätze mal, dass da die Bereichsprüfung nicht eingeschaltet sein darf? Oder sieht das der Compiler eh nicht?
Gruss Reinhard
BenBE - Do 19.03.09 15:48
Entweder die Bereichsprüfung abschalten (schlechte Idee), oder mit einer Variablen zugreifen. Bei statischen Arrays, auf die über Pointer zugegriffen wird, prüft der Compiler keine Array-Indizes; bei Konstanten tut er es.
Alternative: Index im Array selber ausrechnen:
Delphi-Quelltext
1:
| Dst := Pointer(Integer(DstMem) + Index * SizeOf(TBar)); |
sky21 - Mo 23.03.09 18:10
guter ansatz. danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!