Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Type-Deklaration in Delphi (https://www.delphipraxis.net/117095-type-deklaration-delphi.html)

x000x 11. Jul 2008 13:14


Type-Deklaration in Delphi
 
Moin moin,

wie ist diese Deklaration korrekt zu übersetzen?
Code:
typedef enum _PfForwardAction {
   PF_ACTION_FORWARD = 0,
   PF_ACTION_DROP
} PFFORWARD_ACTION,*PPFFORWARD_ACTION;
In Delphi 2007 funktioniert folgendes:
Delphi-Quellcode:
type
  _PfForwardAction = (
    PF_ACTION_FORWARD = 0,
    PF_ACTION_DROP );
  PFFORWARD_ACTION = _PfForwardAction;
  PPFFORWARD_ACTION = ^_PfForwardAction;
das kann ich in Delphi 5 aber so nicht schreiben. Wäre dort denn folgendes richtig? bzw. wie würde es korrekt sein?
Delphi-Quellcode:
const
  PF_ACTION_FORWARD = 0;
  PF_ACTION_DROP   = 1;

type
  PFFORWARD_ACTION = Integer;
  PPFFORWARD_ACTION = ^PFFORWARD_ACTION;

Medium 11. Jul 2008 13:44

Re: Type-Deklaration in Delphi
 
Also mein Delphi 7 kann die erste Übersetzung problemlos kompilieren, jedoch habe ich kein Delphi 5 zum testen da. Kann es sein, dass dort die explizite Wertzuweisung an einen Enum-Bezeichner Ärger macht? Weil wenn es nur das ist, kannst du die Zuweisung auch einfach weglassen, da ohnehin dem ersten Eintrag 0 zugewiesen wird.

Ansonsten kann man ohne die Compilermeldung nur rumraten.


Edit: DeddyH hats ausgeschrieben, man senke die Augen ein paar wenige Grad :)

DeddyH 11. Jul 2008 13:47

Re: Type-Deklaration in Delphi
 
Ich denke mal, so sollte es gehen:
Delphi-Quellcode:
type
  _PfForwardAction = (PF_ACTION_FORWARD,PF_ACTION_DROP);
  PFFORWARD_ACTION = _PfForwardAction;
  PPFFORWARD_ACTION = ^_PfForwardAction;

x000x 11. Jul 2008 13:58

Re: Type-Deklaration in Delphi
 
Danke für eure Antworten...

@Medium: Ja, es liegt an der Wertzuweisung.
@DeddyH: So hatte ich es auch, bis mir folgende Konstrukte ins Auge gefallen sind:
Code:
/*
 * fltdefs.h
 */

typedef enum _GlobalFilter {
   GF_FRAGMENTS = 2,
   GF_STRONGHOST = 8,
   GF_FRAGCACHE = 9
} GLOBAL_FILTER,*PGLOBAL_FILTER;
Delphi-Quellcode:
type
  _GlobalFilter = (
    GF_FRAGMENTS = 2,
    GF_STRONGHOST = 8,
    GF_FRAGCACHE = 9);
  GLOBAL_FILTER = _GlobalFilter;
  PGLOBAL_FILTER = ^_GlobalFilter;
Müsste ich jetzt sozusagen Dummys einfügen? Wäre ja bei Zuweisungen von n = 1024 etc. ganz schön aufwendig :gruebel:

EDIT (Compilermeldung): [Fehler] fltdefs.pas(71): ',' oder ')' erwartet, aber '=' gefunden

shmia 11. Jul 2008 14:00

Re: Type-Deklaration in Delphi
 
Zitat:

Zitat von Medium
... jedoch habe ich kein Delphi 5 zum testen da. Kann es sein, dass dort die explizite Wertzuweisung an einen Enum-Bezeichner Ärger macht?

Ja, das ist so. Delphi 5 kennt nur Aufzählungstypen, die mit 0 beginnen.

axellang 11. Jul 2008 14:10

Re: Type-Deklaration in Delphi
 
Hallo,

eine kurze und gute Beschreibung warum das mit D5 so nicht geht findest Du unter: Pitfalls of converting.
Außerdem findest Du dort auch ein Conversion Helper Package für die IDE.

Gruß

Axel

Medium 11. Jul 2008 15:24

Re: Type-Deklaration in Delphi
 
Okay, in dem Fall ist die einfachste und imho sinnvollste Lösung in der Tat das Auflösen in Konstanten, und einen "Dummy"-Enum Typ als LongInt. Interessant fand ich da insbesondere die in dem Link angesprochene Problematik bei der Parameterübergabe, so dass es bei Verwendung von DLLs o.ä. in diesem Zusammenhang noch sinnvoller ist :)

x000x 12. Jul 2008 23:38

Re: Type-Deklaration in Delphi
 
@axellang: Danke für den interessanten link...
Demnach müsste es für D5 so korrekt sein:
Delphi-Quellcode:
const
  PF_ACTION_FORWARD = 0;
  PF_ACTION_DROP   = 1;

type
  PFFORWARD_ACTION = LongInt;
  PPFFORWARD_ACTION = ^PFFORWARD_ACTION;


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