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 "C" Strukturen in Delphi verwenden (https://www.delphipraxis.net/116273-c-strukturen-delphi-verwenden.html)

S20000 26. Jun 2008 07:54


"C" Strukturen in Delphi verwenden
 
Hallo zusammen,

ich schreibe z.Z ein Delphi Programm das zum Teil
auf den C-Code von jemand anderen über eine DLL zugreift.
Innerhalb des C-Codes werden Strukturen definiert,
das sieht dann beispielsweise so aus:

Delphi-Quellcode:
typedef struct TTest
{
   char name
   double zahl
   double zahl2
}TTest;
Auf diese Strukturen möchte ich nun über Funktionen, die einen Pointer
auf diese Strukturen übergeben, zugreifen.

Nun stehe ich irgendwie auf dem Schlauch wie ich Delphi klarmache, dass
sich hinter dem übergebenen Pointer ein C-struct (was ja nichts
anderes als ein Record ist) verbirgt.

An welcher mache ich Delphi bekannt, dass ein Struct im Speicher liegt?
Vielleicht kann mir jemand mit einem Beispiel helfen


Gruß
Sebastian

DeddyH 26. Jun 2008 07:58

Re: "C" Strukturen in Delphi verwenden
 
Entweder definierst Du typisierte Pointer oder machst einen expliziten Cast.
Typisierte Pointer:
Delphi-Quellcode:
type PTest = ^TTest;
TTest = record
  ...
end;
Cast:
Delphi-Quellcode:
ShowMessage(FloatToStr(TTest(Pointervar^).zahl));

S20000 26. Jun 2008 08:04

Re: "C" Strukturen in Delphi verwenden
 
Delphi-Quellcode:
type PTest = ^TTest;
TTest = record
  name[0..99] of char;
  ...
end;
Wenn ich das so mache ist PTest ein Zeiger auf Record TTest,
woher ist dem Compiler dann bekannt, dass auf die Daten
im struct zugegriffen wird. Ich kann da noch nicht ganz
folgen.

Ghostwalker 26. Jun 2008 08:13

Re: "C" Strukturen in Delphi verwenden
 
Ok..wenn ich dich richtig verstehe bekommst du einen untypisierten Zeiger von der DLL-Funktion zurück. Der Funktionskopf sieht also ungefähr so aus:

Delphi-Quellcode:
    function MeineDLL_C_Funktion(meinParameter:integer):Pointer;
Wenn du einfach das Funktions-Ergebnis einer Variable vom Typ PTest zuweise, weis Delphi wie der Speicher aufgebaut ist und du kannst mithilfe der Dereferenzierung einfach auf die Elemente zugreifen.


P.S. Tutorial zum Thema Zeiger :)

QuickAndDirty 26. Jun 2008 08:15

Re: "C" Strukturen in Delphi verwenden
 
Delphi-Quellcode:
type
TTest=record
   name:Char;
   zahl:Double;
   zahl2:Double;
end;
PTest=Test^;
Records sind blöde Speicherschnipsel
Evtl. musst du bei dem Record Packet verwenden.

du kannst genauso gut
Delphi-Quellcode:
type
Test=array[0..sizeof(TTest)] of Byte;
machen


einfach den Pointer dereferenzieren und in irgend einen Typ array oder record der Passenden Größe casten
bzw. den untytpisierten Pointer in einen Typisierten Pointer der passenden Größe casten.

DeddyH 26. Jun 2008 08:49

Re: "C" Strukturen in Delphi verwenden
 
Zitat:

Zitat von QuickAndDirty
Delphi-Quellcode:
type
TTest=record
   name:Char;
   zahl:Double;
   zahl2:Double;
end;
PTest=Test^; //nicht ganz richtig, muss PTest = ^TTest heißen


hoika 26. Jun 2008 08:57

Re: "C" Strukturen in Delphi verwenden
 
Hallo,

bei dem Char wäre is noch wichtig,
ob er nicht char* meint, weil ein Zeichen für den Namen ist ein bissel mickrig.

Das wäre dann in Delphi ein PChar.


Heiko

S20000 26. Jun 2008 09:03

Re: "C" Strukturen in Delphi verwenden
 
Ich mache nochmal ein konkretes Beispiel
weil ich glaube das es sich doch um typisierte Zeiger handelt.
Ich werfe diese Begrife immer noch durcheinander.

Delphi-Quellcode:
//C-Code

typedef struct TTest
{
  char name[100];
  int zahl1;
}TTest;

typedef struct Namen

 TInfo *namen;    // wird wird ein dynamisches Array angelegt
}
Was hier nach meinem Verständnis gemacht wird ist ein
Zeiger auf TInfo. Dieser Zeiger kann man (In C) mit einem
Index versehen. Es gibt also eine Menge von TTest structs.

Auf diese structs möchte ich nun in Delphi zugreifen...

hoika 26. Jun 2008 12:30

Re: "C" Strukturen in Delphi verwenden
 
Hallo,

zuerst mal fehlt dir in der struct Namen noch ein

int iCount

sonst weisst du nicht, wie viele im Array sind.

Zum Zugriff würde ich einen Hilfspointer benutzten.

Delphi-Quellcode:
type
  TTInfo: packed record
    name: array[0..100] of Char;
    zah1: Integer;
  end;
  PInfo = ^TInfo;

var
  P: Pointer;
  MyPInfo: PInfo;
begin
 // 1. Element
  P:= PInfo(Namen.namen);

 // Zugriff
  PInfo:= P;
  PInfo^.zahl // Zugriff

 // 2. Element
  P:= PInfo(Namen.namen+SizeOf(TInfo));  // noch + 1 , enfach mal probieren
  PInfo:= P;
  PInfo^.zahl // Zugriff
Falls Delphi bei den Zeigern meckert, nimm statt Pointer PChar.


Heiko

S20000 26. Jun 2008 15:23

Re: "C" Strukturen in Delphi verwenden
 
Zitat:

..sonst weisst du nicht, wie viele im Array sind.
Da wurde die Vereinbarung getroffen, dass der letzte Name
mit #0 versehen ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr.
Seite 1 von 2  1 2      

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