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:
// wird n mal aufgerufen; size bleibt konstant (z.B. 1024), nach 10x soll der zusemmengesetzte Datenblock weiterverarbeitet werden.
procedure TMyClass.Add(pData : Pointer; size : Integer);
begin
 
 if (FSize = (10 * size ) then
 begin
   processLargeBlock(FpData, 10*size)
   FSize := 0
 end
 else
 begin
  // todo
 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); // geht nicht wegen 'dst[len1]'


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); // nicht soooo toll


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..0of 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

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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..0of 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!