AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Portierung von C++

Ein Thema von daywalker9 · begonnen am 24. Mär 2010 · letzter Beitrag vom 25. Mär 2010
Antwort Antwort
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#1

Portierung von C++

  Alt 24. Mär 2010, 20:47
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]
Lars
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Protierung von C++

  Alt 24. Mär 2010, 21:48
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Protierung von C++

  Alt 24. Mär 2010, 22:02
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 TIMAGEHLP_SYMBOL = IMAGEHLP_SYMBOL; deklarieren, damit es Delphikomform ist.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#4

Re: Portierung von C++

  Alt 25. Mär 2010, 11:37
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;
  Mit Zitat antworten Zitat
hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Protierung von C++

  Alt 25. Mär 2010, 12:53
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;
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Portierung von C++

  Alt 25. Mär 2010, 16:13
Ich weiss nicht was für Schleifen da jetzt schuld waren, aber du hast Recht. Ich nehme alles zurück, und behaupte das Gegenteil!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 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