Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi C -> Delphi: Struct im Struct, wie übersetzen? (https://www.delphipraxis.net/89629-c-delphi-struct-im-struct-wie-uebersetzen.html)

dizzy 3. Apr 2007 11:49


C -> Delphi: Struct im Struct, wie übersetzen?
 
Aloah zusammen!

Ich übersetze gerade ein Headerfile von C nach Delphi, und bin auf ein Konstrukt gestoßen, dass ich nicht so recht einzuordnen weiss. Die Übersetzung davon muss strukturell nachher das gleiche im Speicher ergeben denke ich, da dieses Struct an eine DLL weitergereicht wird. Ich glaub, die würde sonst allergisch reagieren :)

Hier der Code
Code:
struct S7_SCAN_OBJECT
{
   ord16   state;   
   ord16   ack_state;   
   ord16   event_state;   
   ord32   event_id;   
   ord16   no_add_value;   
   struct    
   {      ord16   data_type;            
         ord16   add_value_len;            
         ord8   value[S7_MAX_SCAN_ADD_VALUE_LEN+2];   
   }add_value[S7_MAX_ADD_VALUES];
};
Was tut dies?

Vielen Dank schonmal im Voraus!
Gruss,
Fabian

Der_Unwissende 3. Apr 2007 11:57

Re: C -> Delphi: Struct im Struct, wie übersetzen?
 
Zitat:

Zitat von dizzy
Ich übersetze gerade ein Headerfile von C nach Delphi, und bin auf ein Konstrukt gestoßen, dass ich nicht so recht einzuordnen weiss.

Hi,
Du hast doch schong gesagt, dass es sich um ein Struct in einem Struct handelt. Ein Struct ist dabei ein Verbundtyp (record in Delphi). Hinter dem kommen noch eckige Klammern (also ein Array von diesem Verbundtyp).
In Delphi kannst Du das einfach nachbilden, indem Du die Deklaration rausziehst:

Delphi-Quellcode:
type
  ord16 = Word; // (oder was auch immer)
  ord32 = Cardinal; // (oder was auch immer)

  TAdd_Value = record
    data_type: ord16;
    ....
  end;

  TScanObject = record
    state: ord16;
    ...
    add_value: Array[0..S7_MAX_ADD_VALUES - 1] of TAdd_Value;
  end;
Gruß Der Unwissende

dizzy 3. Apr 2007 12:14

Re: C -> Delphi: Struct im Struct, wie übersetzen?
 
Ah, okay. Danke dir 3 bis 4 mal! Ja, das leuchtet ein beim zweiten Blick darauf.

Ich muss im selben Kontext noch eine Sache nachfragen (ähnlich, daher keine neue Frage).

Code:
int32 S7_FAR_PASCAL s7_cycl_read(ord32 cp_descr,ord16 cref,ord16 orderid,
                                 ord16 cycl_time,ord16 number,
                                 struct S7_READ_PARA
                                        S7_FAR_DATA *read_para_array);
Das ist ein Funktionsaufruf an die DLL. Was mich hier fuchst, ist der Struct in der Parameterlist.
S7_FAR_PASCAL ist als Pascal Calling-Convention definiert, kann also wohl ausgelassen werden.
S7_READ_PARA ist ein bereits definierted struct (record), S7_FAR_DATA ist als "far" definiert (imho kann das weggelassen werden). Warum aber steht das Wort "struct" da noch mit drin, wo der Typ des Parameters an sich ja bereits ein Struct ist?
Wäre das richtig übersetzt?
Delphi-Quellcode:
function S7_FAR_PASCAL(cp_descr: ord32;
                       cref: ord16;
                       orderid: ord16;
                       cycl_time: ord16;
                       number: ord16;
                       read_para_array: S7_READ_PARA): int32;
(int32, ord16 und Konsorten sind klar, und definiert)

Flocke 3. Apr 2007 12:17

Re: C -> Delphi: Struct im Struct, wie übersetzen?
 
Hat mit der C-Syntax zu tun.
"struct X" muss dort immer auch als "struct X" angegeben werden.
Erst nach "typedef ... Y" kann man es nur als "Y" angeben, also z.B. "typedef struct X { ... } Y".

In C++ kann man sich das sparen, da wird durch "struct X" auch der Typ "X" deklariert.

dizzy 3. Apr 2007 13:09

Re: C -> Delphi: Struct im Struct, wie übersetzen?
 
Alles klar, dann nehme ich meine Übersetung als richtig an. Heissen Dank euch beiden nochmals! :dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr.

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