Interoptservice



  • Hallo.

    Ich habe ein Problem. Ich habe folgende Struct in C++ definiert:

    typedef struct TCell{
    	struct TPoint P;
    	struct TFace** ppFace;
    	struct TNode** ppNode;
    
    	double Volume;
    	unsigned int nFace;
    	//unsigned int nNode;
    	unsigned long Index;
    	unsigned long Index2;
    
    	struct TFamily* pFamily;
    }TCell;
    

    Und die "gleiche" Structur noch in C#

    [StructLayout(LayoutKind.Sequential)]
            public struct TCell
            {
                	public TPoint P;
    	        public TFace** ppFace;
                    public TNode** ppNode;
    
    	        public double Volume;
    	        public UInt16 nFace;
                    //public UInt16 nNode;
                    public UInt32 Index;
                    public UInt32 Index2;
    
    	        public TFamily* pFamily;
            }
    

    Meine C++ DLL liest die Daten, in C# gebe ich sie aus. Funktioniert seit Monaten in den Programm wunderbar. Muss es auch, denn die Daten werdne auch graphisch ausgegeben. Hinter den Daten steckt auch ein Gitter, auf welchem numerische Berechnungen ausgeführt werden - die Ergebnisse sind stets korrekt. Ich kann also sicher sein, dass wirklich jeder Wert korrekt in C# ausgegeben wird.

    Jetzt nehme ich den Comment in beiden Fälle vor nNode weg und möchte auf nNode zugreifen. nNode ist immer 0, was nicht korrekt ist, aber den korrekten Wert für nNode bekomme ich, wenn ich auf Index zugreife. Es scheint, als hätte C# oder C++ das Struct auf einmal neu sortiert. Oder woran könnte der Fehler noch liegen?

    sizeof(TCell) in C++ ergibt genauso wie sizeof(TCell) in C# jeweils 72.



  • Da ist nichts umsortiert in der Reihenfolge. - Die Adressierung passt einfach nicht.



  • Sollte "unsigned int" nicht in C# "UInt32" sein?
    Oder ist "sizeof(unsigned int)" bei deinem C++-Compiler wirklich nur 2 (und nicht 4)?



  • Also, es funktioniert, wenn man wie Structs wie folgt definiert:

    C++:

    typedef struct TCell{
    	struct TPoint P;
    	struct TFace** ppFace;
    	struct TNode** ppNode;
    
    	double Volume;
    	UINT16 nFace;
    	UINT16 nNode;
    	UINT32 Index;
    	UINT32 Index2;
    
    	struct TFamily* pFamily;
    }TCell;
    

    C#:

    [StructLayout(LayoutKind.Sequential)]
            public struct TCell
            {
                public TPoint P;
                public TFace** ppFace;
                public TNode** ppNode;
    
                public double Volume;
                public UInt16 nFace;
                public UInt16 nNode;
                public UInt32 Index;
                public UInt32 Index2;
    
                public TFamily* pFamily;
            }
    

    Aber fragt mich nicht wieso. Ich arbeite seit Monaten so und es hatte stets geklappt. Die Größe der Sructs wars immer gleich und die Größen der jeweiligen Variablen hatte ich mit sizeof() korrigiert.

    Auch mit StructsLayout = Layout.Explicit und der Angabe von FieldOffsets hatte nichts gebracht.



  • Funktioniert es nun oder nicht?


Anmelden zum Antworten