Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Portierung von C++ (https://www.delphipraxis.net/149589-portierung-von-c.html)

daywalker9 24. Mär 2010 19:47


Portierung von C++
 
Hallo Leute,

mal eine kleine Frage an euch: Ist diese Übersetzung eines C++ Struct korrekt?

Delphi-Quellcode:
type
//typedef struct _IMAGEHLP_SYMBOL
//{
//    DWORD                      SizeOfStruct;
//    DWORD                      Address;
//    DWORD                      Size;
//    DWORD                      Flags;
//    DWORD                      MaxNameLength;
//    CHAR                       Name[1];
//} IMAGEHLP_SYMBOL, *PIMAGEHLP_SYMBOL;

  PIMAGEHLP_SYMBOL = ^IMAGEHLP_SYMBOL;
  IMAGEHLP_SYMBOL = record
    SizeOfStruct: DWORD;          // set to sizeof(IMAGEHLP_SYMBOL)
    Address: DWORD;               // virtual address including dll base address
    Size: DWORD;                  // estimated size of symbol, can be zero
    Flags: DWORD;                 // info about the symbols, see the SYMF defines
    MaxNameLength: DWORD;         // maximum size of symbol name in 'Name'
    Name: array[0..1] of AnsiChar;               // symbol name (null terminated string)
  end;
Vielen dank

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

Medium 24. Mär 2010 20:48

Re: Protierung von C++
 
Jain. Generell besteht immer ein klein wenig Unsicherheit beim Alignment. Bei DWORD-Folgen ist das meist kein Problem (da selten >32Bit aligned wird), beim Array könnte ein "packed" nötig sein. KÖNNTE!

Und dann ist da noch diese prima Schreibweise bei Structs: Der Typ heisst "_IMAGEHLP_SYMBOL", also das was gleich nach dem Schlüsselwort "struct" steht. Was hinter der "}" folgt, sind Variablendeklarationen dieses Typs. "IMAGEHLP_SYMBOL" und "*PIMAGEHLP_SYMBOL" sind also globale Variablen, ersterer vom Typ des Structs, zweiterer ein Pointer darauf - für den aber kein separater eigener Typ definiert wird, sondern "inline" per "*"-Operator realisiert ist.
Das heisst also, dass das Struct an sich korrekt übersetzt ist, jedoch "falsch" benannt, und die Variablendeklarationen müssten sprachbedingt an anderer Stelle noch erfolgen, hier fehlen sie.

Es gibt auch noch einen kleinen netten Unterschied: Instanzen von Structs landen auf dem Stack. Um sie referenziert auf dem Heap zu haben, muss man einen Pointer auf den Struct nehmen. Letzteres ist in Delphi die einzige Wahl, und bedarf keiner weiteren Pointer-Deklaration, die aber zwecks Ähnlichkeit zum Original auch nicht weh tun würde.

TheReaper 24. Mär 2010 21:02

Re: Protierung von C++
 
Du hast 2 Byte für "name" reserviert. Im c++ struct ist es nur einer. Am besten gleich PAnsiChar nehmen und das array weg.

Und ich würde noch
Delphi-Quellcode:
TIMAGEHLP_SYMBOL = IMAGEHLP_SYMBOL;
deklarieren, damit es Delphikomform ist. ;)

Blup 25. Mär 2010 10:37

Re: Portierung von C++
 
Ein PAnsiChar geht natürlich nicht so einfach, dann wäre die Struktur nicht identisch.
Die Größe des Arrays Name ist dynamisch und damit die Größe des gesamten Records.
Delphi-Quellcode:
type
  PIMAGEHLP_SYMBOL = ^TIMAGEHLP_SYMBOL;
  TIMAGEHLP_SYMBOL = record
    SizeOfStruct: DWORD;          // set to sizeof(IMAGEHLP_SYMBOL)
    Address: DWORD;               // virtual address including dll base address
    Size: DWORD;                  // estimated size of symbol, can be zero
    Flags: DWORD;                 // info about the symbols, see the SYMF defines
    MaxNameLength: DWORD;         // maximum size of symbol name in 'Name'
  private
    FName: array[0..0] of AnsiChar; // symbol name (null terminated string)
    function GetName: PAnsiChar;
  public
    property Name: PAnsiChar read GetName;
  end;

function TIMAGEHLP_SYMBOL.GetName: PAnsiChar;
begin
  if MaxNameLength = 0 then
    Result := nil
  else
    Result := @FName;
end;

hansmaad 25. Mär 2010 11:53

Re: Protierung von C++
 
Zitat:

Zitat von Medium
Und dann ist da noch diese prima Schreibweise bei Structs: Der Typ heisst "_IMAGEHLP_SYMBOL", also das was gleich nach dem Schlüsselwort "struct" steht. Was hinter der "}" folgt, sind Variablendeklarationen dieses Typs. "IMAGEHLP_SYMBOL" und "*PIMAGEHLP_SYMBOL" sind also globale Variablen, ersterer vom Typ des Structs, zweiterer ein Pointer darauf -

Hier werden keine glogable Variablen deklariert.
Das Schlüsselwort typedef definiert hier die Typen IMAGEHLP_SYMBOL, ein struct vom Typ _IMAGEHLP_SYMBOL und
PIMAGEHLP_SYMBOL, ein Zeiger auf so ein struct.
Eine abgekürzte Schreibweise für:
Code:
struct A_{
int a;
};
typedef A_ A;
typedef A_* PA;

Medium 25. Mär 2010 15:13

Re: Portierung von C++
 
:oops: Ich weiss nicht was für Schleifen da jetzt schuld waren, aber du hast Recht. Ich nehme alles zurück, und behaupte das Gegenteil! :spin2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 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