2017-01-17 3 views
-1

zu implementieren Ich aktualisierte die jvm openvr binding auf die letzte openvr Version, 1.0.5, aber ich bin unsicher über eine Sache.Wie in Jna eine Struktur sizeof() mit einer Union Typ

In cpp gibt es die IVROverlay Klasse mit dieser virtuellen SetOverlayIntersectionMask Funktion:

virtual EVROverlayError SetOverlayIntersectionMask(
      VROverlayHandle_t ulOverlayHandle, 
      VROverlayIntersectionMaskPrimitive_t *pMaskPrimitives, 
      uint32_t unNumMaskPrimitives, 
      uint32_t unPrimitiveSize = sizeof(VROverlayIntersectionMaskPrimitive_t)) = 0; 

Meine Zweifel in Bezug auf das letzte Argument.

VROverlayIntersectionMaskPrimitive_t:

struct VROverlayIntersectionMaskPrimitive_t 
{ 
    EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType; 
    VROverlayIntersectionMaskPrimitive_Data_t m_Primitive; 
}; 

ist eine Struktur mit einem Aufzählungstyp und einem Union-Typ Variable, genannt VROverlayIntersectionMaskPrimitive_Data_t:

typedef union 
{ 
    IntersectionMaskRectangle_t m_Rectangle; 
    IntersectionMaskCircle_t m_Circle; 
} VROverlayIntersectionMaskPrimitive_Data_t; 

Welche rechts oben durch die beiden Klassen implementiert wird, IntersectionMaskRectangle_t und IntersectionMaskCircle_t

Jetzt übersetzt die enum zu Int aber letzteres? Da es ein Zeiger sein sollte, denke ich, dass es Pointer.SIZE sein soll?

aber dies ist meine Implementierung, wo VROverlayIntersectionMaskPrimitive_Data_t eine abstrakte Klasse ist:

abstract class VROverlayIntersectionMaskPrimitive_Data_t : Structure { 

    constructor() : super() 
    constructor(peer: Pointer) : super(peer) 
} 

durch die two other classes wiederum realisiert.

Mein first guess ist, dass sizeof(VROverlayIntersectionMaskPrimitive_Data_t) zu Int + Pointer.SIZE

@JvmOverloads fun setOverlayIntersectionMask(
       ulOverlayHandle: VROverlayHandle_t, 
       pMaskPrimitives: VROverlayIntersectionMaskPrimitive_t.ByReference, 
       unNumMaskPrimitives: Int, 
       unPrimitiveSize: Int = Int.BYTES + Pointer.SIZE) 

übersetzt Ist meine Argumentation erscheinen korrekt?

+0

Ihre Wörter sind extrem verwirrend ... was ist mit 'sizeof' - glauben Sie eigentlich, dass dieses Schlüsselwort eine Art Datentyp ist? Nun, es ist nicht. Es ist ein C/C++ ** Operator ** und es wird ein Ergebnis vom Typ "size_t" ergeben - keine Zeiger beteiligt, es sei denn, Sie möchten die Größe eines bestimmten Zeigers abrufen ... was eigentlich eine gute Idee ist, da sogar Zeiger sein können in verschiedenen Größen, abhängig von Ihrer Architektur – specializt

+0

Sorry, mein Fehler, ich modifiziert, ich hoffe, ist jetzt klar – elect

Antwort

2

Sie erhalten die Größe eines Structure (einschließlich Union) mit der size() Methode. Im Fall von Gewerkschaften erhalten Sie die Größe des größten Mitglieds.

Sie legen den gewünschten Typ der Union mit Union.setType() fest.

+0

Wie kann ich überprüfen/Abfrage, welche Struktur der Union ist? Gibt es einen Weg von jna? – elect

+0

Das ist implementierungsspezifisch. Normalerweise hat die Union in jedem Mitglied ein gemeinsames "Typ" -Feld, oder Sie können anhand des Kontexts, in dem es verwendet wird, erkennen. – technomage

+0

Endlich habe ich es richtig verstanden, danke Liebes! – elect