Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 18:38

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: typedef union => Pascal
BeitragVerfasst: Di Mär 26, 2013 09:45 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Hi,

ich arbeite grade an SDL 2.0 Pascal-Headern. Nun habe ich folgendes Problem:

Code:
  1.  
  2. typedef enum
  3. {
  4.     SDL_FIRSTEVENT     = 0,    
  5.  
  6.     /* Application events */
  7.     SDL_QUIT           = 0x100, /**< User-requested quit */
  8.  
  9.     /* Window events */
  10.     SDL_WINDOWEVENT    = 0x200, /**< Window state change */
  11.     SDL_SYSWMEVENT,             /**< System specific event */
  12.  
  13.   ..... (andere typen...)
  14.  
  15.     SDL_LASTEVENT    = 0xFFFF
  16. } SDL_EventType;
  17.  


Dann folgen einige Structs und dann:

Code:
  1.  
  2. typedef union SDL_Event
  3. {
  4.     Uint32 type;                    /**< Event type, shared with all events */
  5.    [code] SDL_GenericEvent generic;       /**< Generic event data */ //[/code]
  6.     SDL_WindowEvent window;         /**< Window event data */
  7.  
  8.    ....
  9.  
  10.     SDL_DropEvent drop;             /**< Drag and drop event data */
  11.  
  12.     /* This is necessary for ABI compatibility between Visual C++ and GCC
  13.        Visual C++ will respect the push pack pragma and use 52 bytes for
  14.        this structure, and GCC will use the alignment of the largest datatype
  15.        within the union, which is 8 bytes.
  16.  
  17.        So... we'll add padding to force the size to be 56 bytes for both.
  18.     */
  19.     Uint8 padding[56];
  20. } SDL_Event;
  21.  

 
Wie soll ich das jetzt übersetzen?
 
Die Enumeration ist ja einfach, aber soll ich nun in der Übersetzung des Union-Typs es so machen (wie in den Headern von 1.2):
 
 
Code:
  1.  
  2. TSDLEvent = record
  3.   case Integer of
  4.     SDL_WINDOWEVENT: (window: TSDL_WindowEvent);
  5. ...
  6.   end;
  7. end;
  8.  
  9.  

 
oder so, wie es in diversen anderen Anleitungen beschrieben wird zur Übersetzung von unions:
 
Code:
  1.  
  2.  
  3. TSDLEvent= record
  4.   case Integer of
  5.     0:  (type_: UInt32);
  6.     1:  (generic: TSDL_GenericEvent);
  7.     2:  (window: TSDL_WindowEvent);
  8.     3:  (key: TSDL_KeyboardEvent);
  9.   end;
  10. end;
  11.  
  12.  

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Di Mär 26, 2013 12:38 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Ich habe es jetzt einfach mittels der letzteren Methode gemacht, schließlich gibt es ja auch nicht für jeden Event-Typ die passende Enumeration.

Ob es funktioniert, kann ich leider aufgrund einiger fehlender Arbeit noch nicht sagen...

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Di Mär 26, 2013 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Es ist egal, mit welcher Variante du es machst. Es ist aber (meiner Meinung nach) leserlicher, diejenige zu verwenden, die den Enum mit einbezieht.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Di Mär 26, 2013 18:30 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
achso...

Danke - werde natürlich die Enumeration miteinbeziehen ;)

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Mi Mär 27, 2013 08:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Soweit ich das sehe ist es einfach nur ein generic event. Die union wuerde ich ausser acht lassen.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Mi Mär 27, 2013 20:13 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Ich weiß nicht was du meinst...

Diesen Code will ich übersetzen:

Code:
  1.  
  2.  
  3.  
  4. typedef enum
  5. {
  6.     SDL_FIRSTEVENT     = 0,     /**< Unused (do not remove) */
  7.  
  8.     /* Application events */
  9.     SDL_QUIT           = 0x100, /**< User-requested quit */
  10.  
  11.     /* Window events */
  12.     SDL_WINDOWEVENT    = 0x200, /**< Window state change */
  13.     SDL_SYSWMEVENT,             /**< System specific event */
  14.  
  15.     /* Keyboard events */
  16.     SDL_KEYDOWN        = 0x300, /**< Key pressed */
  17.     SDL_KEYUP,                  /**< Key released */
  18.     SDL_TEXTEDITING,            /**< Keyboard text editing (composition) */
  19.     SDL_TEXTINPUT,              /**< Keyboard text input */
  20.  
  21.     /* Mouse events */
  22.     SDL_MOUSEMOTION    = 0x400, /**< Mouse moved */
  23.     SDL_MOUSEBUTTONDOWN,        /**< Mouse button pressed */
  24.     SDL_MOUSEBUTTONUP,          /**< Mouse button released */
  25.     SDL_MOUSEWHEEL,             /**< Mouse wheel motion */
  26.  
  27.     /* Joystick events */
  28.     SDL_JOYAXISMOTION  = 0x600, /**< Joystick axis motion */
  29.     SDL_JOYBALLMOTION,          /**< Joystick trackball motion */
  30.     SDL_JOYHATMOTION,           /**< Joystick hat position change */
  31.     SDL_JOYBUTTONDOWN,          /**< Joystick button pressed */
  32.     SDL_JOYBUTTONUP,            /**< Joystick button released */
  33.     SDL_JOYDEVICEADDED,         /**< A new joystick has been inserted into the system */
  34.     SDL_JOYDEVICEREMOVED,       /**< An opened joystick has been removed */
  35.  
  36.     /* Game controller events */
  37.     SDL_CONTROLLERAXISMOTION  = 0x650, /**< Game controller axis motion */
  38.     SDL_CONTROLLERBUTTONDOWN,          /**< Game controller button pressed */
  39.     SDL_CONTROLLERBUTTONUP,            /**< Game controller button released */
  40.     SDL_CONTROLLERDEVICEADDED,         /**< A new Game controller has been inserted into the system */
  41.     SDL_CONTROLLERDEVICEREMOVED,       /**< An opened Game controller has been removed */
  42.     SDL_CONTROLLERDEVICEREMAPPED,      /**< The controller mapping was updated */
  43.  
  44.     /* Touch events */
  45.     SDL_FINGERDOWN      = 0x700,
  46.     SDL_FINGERUP,
  47.     SDL_FINGERMOTION,
  48.  
  49.     /* Gesture events */
  50.     SDL_DOLLARGESTURE   = 0x800,
  51.     SDL_DOLLARRECORD,
  52.     SDL_MULTIGESTURE,
  53.  
  54.     /* Clipboard events */
  55.     SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard changed */
  56.  
  57.     /* Drag and drop events */
  58.     SDL_DROPFILE        = 0x1000, /**< The system requests a file open */
  59.  
  60.     /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use,
  61.      *  and should be allocated with SDL_RegisterEvents()
  62.      */
  63.     SDL_USEREVENT    = 0x8000,
  64.  
  65.     /**
  66.      *  This last event is only for bounding internal arrays
  67.      */
  68.     SDL_LASTEVENT    = 0xFFFF
  69. } SDL_EventType;
  70.  
  71. ....
  72.  
  73. typedef union SDL_Event
  74. {
  75.     Uint32 type;                    /**< Event type, shared with all events */
  76.     SDL_GenericEvent generic;       /**< Generic event data */
  77.     SDL_WindowEvent window;         /**< Window event data */
  78.     SDL_KeyboardEvent key;          /**< Keyboard event data */
  79.     SDL_TextEditingEvent edit;      /**< Text editing event data */
  80.     SDL_TextInputEvent text;        /**< Text input event data */
  81.     SDL_MouseMotionEvent motion;    /**< Mouse motion event data */
  82.     SDL_MouseButtonEvent button;    /**< Mouse button event data */
  83.     SDL_MouseWheelEvent wheel;      /**< Mouse wheel event data */
  84.     SDL_JoyAxisEvent jaxis;         /**< Joystick axis event data */
  85.     SDL_JoyBallEvent jball;         /**< Joystick ball event data */
  86.     SDL_JoyHatEvent jhat;           /**< Joystick hat event data */
  87.     SDL_JoyButtonEvent jbutton;     /**< Joystick button event data */
  88.     SDL_JoyDeviceEvent jdevice;     /**< Joystick device change event data */
  89.     SDL_ControllerAxisEvent caxis;      /**< Game Controller axis event data */
  90.     SDL_ControllerButtonEvent cbutton;  /**< Game Controller button event data */
  91.     SDL_ControllerDeviceEvent cdevice;  /**< Game Controller device event data */
  92.     SDL_QuitEvent quit;             /**< Quit request event data */
  93.     SDL_UserEvent user;             /**< Custom event data */
  94.     SDL_SysWMEvent syswm;           /**< System dependent window event data */
  95.     SDL_TouchFingerEvent tfinger;   /**< Touch finger event data */
  96.     SDL_MultiGestureEvent mgesture; /**< Gesture event data */
  97.     SDL_DollarGestureEvent dgesture; /**< Gesture event data */
  98.     SDL_DropEvent drop;             /**< Drag and drop event data */
  99.  
  100. } SDL_Event;
  101.  
  102.  


Das Problem hierbei ist nicht die Enumeration an sich, sondern der Union-Typ. Soll ich hierbei die Enumeration miteinbeziehen, oder nicht?

Wie wird das von den gängigen C/C++ Kompilern interpretiert?

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Do Mär 28, 2013 07:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Eine union hat in erster Regel nichts mit structs usw zu tun. Sie ist ein typ der mindestens so groß
wie ihr größtest Kind ist und alle Kinder haben die gleiche Addresse gemeinsam. D.h. sie sind eigentlich
identisch.

Schau dir mal an wie zum Beispiel SDL_GenericEvent und SDL_WindowEvent definiert sind.
Dann wirst du sehen das alle immer den gleichen Anfang haben :)


Von daher müsstest du dir eigentlich nur das größte Event schnappen und dieses definieren.

[edit]
aber vorsicht das ganze hat nichts mit vererbung zu tun. Um auf nummer sicher zu gehen solltest du eigentlich folgendes machen.
Code:
  1.  
  2.  
  3. type target = malloc(sizeof(type))
  4. memcpy(target,union,sizeof(type))
  5.  


falls du C# kannst, das hier waere das Gegenstueck:
Code:
  1.  
  2. [StructLayout(LayoutKind.Explicit)]
  3. struct myunionstruct
  4. {
  5.    [FieldOffset(0)]
  6.    int type;
  7.    [FieldOffset(0)]
  8.    generic_event event;
  9.    [FieldOffset(0)]
  10.    window_quit_event quit_event;
  11.    ....
  12. }
  13.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Do Mär 28, 2013 14:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wie schon gesagt, die Enumeration ist nur Deko, sofern du sie nicht als Element des Records deklariest. Und es ist sehr sinnvoll, den union als case-record zu übernehmen, um den gleichen Komfort beim Zugriff zu haben wie unter C.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Do Mär 28, 2013 15:08 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
mmmh - ich habs jetzt so übersetzt:

Code:
  1.  
  2.  
  3.   TSDL_Event = record
  4.     case Integer of
  5.       0:  (type_: UInt32);
  6.  
  7.       SDL_GENERICEVENT:  (generic: TSDL_GenericEvent);
  8.       SDL_WINDOWEVENT:  (window: TSDL_WindowEvent);
  9.      
  10.       SDL_KEYUP,
  11.       SDL_KEYDOWN:  (key: TSDL_KeyboardEvent);
  12.       SDL_TEXTEDITING:  (edit: TSDL_TextEditingEvent);
  13.       SDL_TEXTINPUT:  (text: TSDL_TextInputEvent);
  14.  
  15.       SDL_MOUSEMOTION:  (motion: TSDL_MouseMotionEvent);
  16.       SDL_MOUSEBUTTONUP,
  17.       SDL_MOUSEBUTTONDOWN:  (button: TSDL_MouseButtonEvent);
  18.       SDL_MOUSEWHEEL:  (wheel: TSDL_MouseWheelEvent);
  19.      
  20.       SDL_JOYAXISMOTION:  (jaxis: TSDL_JoyAxisEvent);
  21.       SDL_JOYBALLMOTION: (jball: TSDL_JoyBallEvent);
  22.       SDL_JOYHATMOTION: (jhat: TSDL_JoyHatEvent);
  23.       SDL_JOYBUTTONDOWN,
  24.       SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent);
  25.       SDL_JOYDEVICEADDED,
  26.       SDL_JOYDEVICEREMOVED: (jdevice: TSDL_JoyDeviceEvent);
  27.  
  28.       SDL_CONTROLLERAXISMOTION: (caxis: TSDL_ControllerAxisEvent);
  29.       SDL_CONTROLLERBUTTONUP,
  30.       SDL_CONTROLLERBUTTONDOWN: (cbutton: TSDL_ControllerButtonEvent);
  31.       SDL_CONTROLLERDEVICEADDED,
  32.       SDL_CONTROLLERDEVICEREMOVED,
  33.       SDL_CONTROLLERDEVICEREMAPPED: (cdevice: TSDL_ControllerDeviceEvent);
  34.  
  35.       SDL_QUITEV: (quit: TSDL_QuitEvent);
  36.  
  37.       SDL_USEREVENT: (user: TSDL_UserEvent);
  38.       SDL_SYSWMEVENT: (syswm: TSDL_SysWMEvent);
  39.  
  40.       SDL_TOUCHFINGERDOWN,
  41.       SDL_TOUCHFINGERUP,
  42.       SDL_TOUCHFINGERMOTION: (tfinger: TSDL_TouchFingerEvent);
  43.       SDL_MULTIGESTURE: (mgesture: TSDL_MultiGestureEvent);
  44.       SDL_DOLLARGESTURE,SDL_DOLLARRECORD: (dgesture: TSDL_DollarGestureEvent);
  45.  
  46.       SDL_DROPFILE: (drop: TSDL_DropEvent);
  47.       end;
  48.   end;
  49.  
  50.  


Ich frage mich ob das geht, schließlich ist bsp. SDL_GenericEvent = $100 und damit <> 1, oder?

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Do Mär 28, 2013 15:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Die Werte selbst sind vollkommen egal. Du hast es also richtig übersetzt.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: typedef union => Pascal
BeitragVerfasst: Do Mär 28, 2013 17:05 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
okay, danke für die Bestätigung! *motivationsschub*

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.032s | 17 Queries | GZIP : On ]