| Autor |
Beitrag |
sky21
      
Beiträge: 141
W7
D2010, XE2
|
Verfasst: Di 17.03.09 17:11
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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)); |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
sky21 
      
Beiträge: 141
W7
D2010, XE2
|
Verfasst: Mo 23.03.09 18:10
|
|
|