Autor Beitrag
sky21
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: 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' ...

ausblenden 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
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

ausblenden 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;

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mo 23.03.09 18:10 
guter ansatz. danke!