Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record aus Speicherbereich initialisieren (https://www.delphipraxis.net/146418-record-aus-speicherbereich-initialisieren.html)

MisterNiceGuy 19. Jan 2010 17:18


Record aus Speicherbereich initialisieren
 
Hi, ich versuche gerade einen Record folgendermaßen zu füllen:

Delphi-Quellcode:
type TVec3D = packed record
  x,y,z:single;
end;

procedure Foo;
   var pPointerAufSpeicherbereich:Pointer;
       a:TVec3D;
begin
   pPointerAufSpeicherbereich := getRichtigenSpeicherbereich;
   a := TVec3D(pPointerAufSpeicherbereich);
end;
Das geht leider so nicht, wie mach ich das ganze richtig?

himitsu 19. Jan 2010 17:24

Re: Record aus Speicherbereich initialisieren
 
Delphi-Quellcode:
a := PVec3D(pPointerAufSpeicherbereich)^;

// oder

a := TVec3D(pPointerAufSpeicherbereich^);

MisterNiceGuy 19. Jan 2010 17:38

Re: Record aus Speicherbereich initialisieren
 
Ah danke, das hilft schonmal :)

Gibt's eine Möglichkeit dann direkt zum nächsten Speicherbereich zu springen der einen TVec3D enthalten könnte?

Ich dachte da an sowas:
Delphi-Quellcode:
inc(pPointerAufSpeicherbereich,sizeof(TVec3D));

Neutral General 19. Jan 2010 17:42

Re: Record aus Speicherbereich initialisieren
 
Zitat:

Zitat von MisterNiceGuy
Ich dachte da an sowas:
Delphi-Quellcode:
inc(pPointerAufSpeicherbereich,sizeof(TVec3D));

Schonmal das da ausprobiert? Genau das funktioniert.

sirius 19. Jan 2010 17:51

Re: Record aus Speicherbereich initialisieren
 
@NG, ich bezweifle, dass man untypisierte pointer so inc'en kann. Zumindest für D7 geht das IMHO nicht.

@TE
Was machst du da? Willst du so etwas haben:
Delphi-Quellcode:
type
  PVec3D = ^TVec3D;
  TVec3D = packed record
    x,y,z:single;
  end;

procedure Foo;
var pPointerAufSpeicherbereich:PVec3D;
begin
   pPointerAufSpeicherbereich := getRichtigenSpeicherbereich;
   for i:=0 to x do
   begin
     pPointerAufSpeicherbereich.x:=5;
     inc(pPointerAufSpeicherbereich); //die Größe weis Delphi durch den typisierten Pointer selber
   end;    
end;

Neutral General 19. Jan 2010 17:58

Re: Record aus Speicherbereich initialisieren
 
@sirius:

Ok dann so:

Delphi-Quellcode:
inc(PByte(pPointerAufSpeicherbereich),sizeof(TVec3D));
oder

Delphi-Quellcode:
inc(PVec3D(pPointerAufSpeicherbereich));

MisterNiceGuy 19. Jan 2010 19:13

Re: Record aus Speicherbereich initialisieren
 
@Sirius: Ich habe einen Speicherbereich in dem mehrere TVec3D's liegen. Diese möchte ich nacheinander in einen Array einlesen.

@Neutral General: Nicht so voreilig, ich würd's nicht posten wenn ich es nicht probiert hätte ;) Aber die Methode mit dem casten auf PByte gefällt mir, hoffe da passiert auch das richtige ;)

Neutral General 19. Jan 2010 19:20

Re: Record aus Speicherbereich initialisieren
 
Die Methoden die ich eben gepostet habe funktionieren beide.

Die 2. Ist evtl sogar nochn Tick eleganter (finde ich) weil inc dort automatisch so viele Bytes nach oben wie es nötig ist... z.B.

Delphi-Quellcode:
inc(PRect(P)) // +16
inc(PPoint(P)) // +8
inc(PWord(P)) // +2

Khabarakh 19. Jan 2010 19:25

Re: Record aus Speicherbereich initialisieren
 
Zitat:

Zitat von MisterNiceGuy
@Sirius: Ich habe einen Speicherbereich in dem mehrere TVec3D's liegen. Diese möchte ich nacheinander in einen Array einlesen.

CopyMemory ;) ?

@Neutral General: Nur komisch, warum das so nicht auch bei Records zulässig ist :gruebel: .

Neutral General 19. Jan 2010 21:51

Re: Record aus Speicherbereich initialisieren
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von MisterNiceGuy
@Sirius: Ich habe einen Speicherbereich in dem mehrere TVec3D's liegen. Diese möchte ich nacheinander in einen Array einlesen.

CopyMemory ;) ?

@Neutral General: Nur komisch, warum das so nicht auch bei Records zulässig ist :gruebel: .

? Natürlich ist das bei Records zulässig. TPoint und TRect sind Records..


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf