memcpy, gibts nicht, ? [ gelöst ]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

memcpy, gibts nicht, ? [ gelöst ]

Beitragvon corpsman » 8. Feb 2010, 09:59 memcpy, gibts nicht, ? [ gelöst ]

Guten Morgen Allerseit,

Ich hab hier 2 Pointer, welche beide auf gleich großen mittels getmem allokierten Speicher zeigen.

Nun will ich den Inhalt von a nach b Kopieren.

Laut Google solls da den Befehl

memcpy geben, den kennt mein Lazarus FPC 2.4.0 aber nicht.

Ich hab es mit Move Probiert, aber das scheint auch nicht zu gehen

In Welcher Unit soll ich denn nun das Memcpy finden , ?

Oder macht man das komplett anders ?

Was ich bisher gemacht habe :
Code: Alles auswählen
var p, p2:Pointer;
Begin
  p := getmem(Size);
  p2 := getmem(Size);
 
Schreibe an Speicheraddresse von P
 
  move(p,p2,size); // das scheint allerdings nur den Pointer p2 auf p um zu biegen und keine Kopie des Speicherbereiches an zu legen.
//  memcpy(p,p2,size); // gibt es wohl nicht
 
Arbeite mit p2 weiter
..
Zuletzt geändert von corpsman am 8. Feb 2010, 10:52, insgesamt 1-mal geändert.
--
Just try it
corpsman
 
Beiträge: 302
Registriert: 28. Feb 2009, 08:54
OS, Lazarus, FPC: Kubuntu Lucid, SVN Lazarus, FPC 2.4.0 
CPU-Target: 32Bit
Nach oben

Beitragvon corpsman » 8. Feb 2010, 10:03 Re: memcpy, gibts nicht, ?

Also ich hab das nun mittels :


Code: Alles auswählen
Procedure memcpy(Const source: Pointer; dest: Pointer; size: Integer);
Var
  i: Integer;
  b, b2: PByte;
Begin
  b := Source;
  b2 := dest;
  For i := 0 To Size - 1 Do Begin
    b2^ := b^;
    inc(b);
    inc(b2);
  End;
End;


Nachgebildet, und das geht auch, nur glaube ich irgendwie das es da was "eleganteres" gibt.
--
Just try it
corpsman
 
Beiträge: 302
Registriert: 28. Feb 2009, 08:54
OS, Lazarus, FPC: Kubuntu Lucid, SVN Lazarus, FPC 2.4.0 
CPU-Target: 32Bit
Nach oben

Beitragvon theo » 8. Feb 2010, 10:07 Re: memcpy, gibts nicht, ?

corpsman hat geschrieben: 
move(p,p2,size); // das scheint allerdings nur den Pointer p2 auf p um zu biegen und keine Kopie des Speicherbereiches an zu legen.


Das ist ja auch das, was du ihm damit befiehlst.
Die Daten liegen in p^, p2^
theo
 
Beiträge: 3839
Registriert: 11. Sep 2006, 18:01

Beitragvon corpsman » 8. Feb 2010, 10:11 Re: memcpy, gibts nicht, ?

ja ich hatte ein C tutorial zu move gelesen, und da stand das es das selbe macht wie copy, na egal

Ich hab ja nun die Funktionierende Variante :

Code: Alles auswählen
Procedure memcpy(Const source: Pointer; dest: Pointer; size: Integer);
Var
  i: Integer;
  b, b2: PByte;
Begin
  b := Source;
  b2 := dest;
  For i := 0 To Size - 1 Do Begin
    b2^ := b^;
    inc(b);
    inc(b2);
  End;
End;


Die Frage ist nur, kann man das irgendwie "Eleganter" machen.

Die Pointer Zeigen übrigens momentan auf einen
Code: Alles auswählen
(* Die Reihenfolge ist hier Besonders WICHTIG*)
  TExternPartikel = Packed Record
    ID: Integer;
    PosX: Single;
    PosY: Single;
    PosZ: Single;
    DirX: Single;
    DirY: Single;
    DirZ: Single;
    Size: Single;
  End;


Später zeigen sie allerdings auf ein beliebig langes Byte array, das ich von einer C Library bekomme, deswegen mus ich also auf jedenfall in Byte schritten auflösen ...
--
Just try it
corpsman
 
Beiträge: 302
Registriert: 28. Feb 2009, 08:54
OS, Lazarus, FPC: Kubuntu Lucid, SVN Lazarus, FPC 2.4.0 
CPU-Target: 32Bit
Nach oben

Beitragvon theo » 8. Feb 2010, 10:23 Re: memcpy, gibts nicht, ?

corpsman hat geschrieben:Später zeigen sie allerdings auf ein beliebig langes Byte array, das ich von einer C Library bekomme, deswegen mus ich also auf jedenfall in Byte schritten auflösen ...


Kapier ich nicht. Dafür hast du ja den size Parameter.
theo
 
Beiträge: 3839
Registriert: 11. Sep 2006, 18:01

Beitragvon corpsman » 8. Feb 2010, 10:31 Re: memcpy, gibts nicht, ?

RESET;

Ich habe die Procedure :

Code: Alles auswählen
Procedure memcpy(Const source: Pointer; dest: Pointer; size: Integer);
    Var
      i: Integer;
      b, b2: PByte;
    Begin
      b := Source;
      b2 := dest;
      For i := 0 To Size - 1 Do Begin
        b2^ := b^;
        inc(b);
        inc(b2);
      End;
    End;

geschrieben, diese kopiert eine Anzahl bytes ( size ) von Source nach dest, diese Anzahl kann auch z.b. 5 sein( da ich sie nicht kenne ist der Parameter ja da, Im Speziellen mus dieser aber eben keine Word allign grenzen treffen).

Nun bin ich der Meinung, dass das was ich da oben gebastelt habe, bei weitem nicht das ist was man als "Schnell" oder "Optimal" betiteln würde.

Meine Hoffnung ist nun das irgend ein ganz netter Mensch hier im Forum weis wie man die Prozedur memcpy anders implementieren kann, so das sie das selbe macht wie die hier gepostete Version nur eben viel schneller.
--
Just try it
corpsman
 
Beiträge: 302
Registriert: 28. Feb 2009, 08:54
OS, Lazarus, FPC: Kubuntu Lucid, SVN Lazarus, FPC 2.4.0 
CPU-Target: 32Bit
Nach oben

Beitragvon theo » 8. Feb 2010, 10:43 Re: memcpy, gibts nicht, ?

Aber warum verwendest du nicht move? (Ich meinte den size parameter bei move)
theo
 
Beiträge: 3839
Registriert: 11. Sep 2006, 18:01

Beitragvon mschnell » 8. Feb 2010, 10:46 Re: memcpy, gibts nicht, ?

corpsman hat geschrieben:ja ich hatte ein C tutorial zu move gelesen....

C Tutorial zum Delphi / FPC "move" ???? das nützt nix.

Korrekt ist natürlich move(a^, b^, size). (move benutzt var und const parameter)

Delphi-Codes für memcpy: Vorsicht bei überlappenden Quell und Zielbereichen !!! move kopiert automatisch so, als würde erst die Quelle zwischengespeichert und dann auf das Ziel kopiert. Das ist fast immer so gewünscht. Lineares vorwärts-kopieren macht unter Umständen etwas anderes.

-Michael
mschnell
 
Beiträge: 1309
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld

Beitragvon corpsman » 8. Feb 2010, 10:51 Re: memcpy, gibts nicht, ?

lol, jetzt hab ichs kapiert.

Also move macht genau was ich will, nur das ich halt vergessen hatte die ^ dahinter zu schreiben, danke für das deutlich machen.
--
Just try it
corpsman
 
Beiträge: 302
Registriert: 28. Feb 2009, 08:54
OS, Lazarus, FPC: Kubuntu Lucid, SVN Lazarus, FPC 2.4.0 
CPU-Target: 32Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

accuracy-worried