Laden...

c++ structs/union in c# aufrufen

Erstellt von werner vor 20 Jahren Letzter Beitrag vor 20 Jahren 3.451 Views
W
werner Themenstarter:in
1 Beiträge seit 2004
vor 20 Jahren
c++ structs/union in c# aufrufen

hallo; ich habe einen dll in c++, welche ich in c# mit [DllImport(... einbinde. funktioniert soweit sehr gut. manche funktionen brauchen aber bestimmte strukturen und ich weiß nicht wie ich dann auf diese strukturen korrekt zugreifen kann.
typedef union tagTS{
unsigned char State;
struct tagTSBits{
unsigned char fb:1;
unsigned char fs:1;
unsigned char ft:1;
}bits;
}TS;

und noch schlimmer
typedef union tagRS{
byte analog;
TS tsValue;
char analogText[9];
}

ich habe mal
[StructLayout(LayoutKind.Sequential)]
struct TS
{
public byte fb;
public byte fs;
public byte ft;
}
bzw. einfach mal ein byte mitgegeben; aber beide ergebnisse sind nicht das was ich mir erwarte.

und bei "char analogText[9];" bin ich mir überhaupt unsicher wie ich das mit dem speicher hinkriege.

danke für eure hilfe. werner

V
842 Beiträge seit 2003
vor 20 Jahren

Hi!

Wieso verwendest du eine union? Den einzigen Sinn den die Dinger haben ist Speicherplatz einzusparen und zur Optimierung sind sie auch geeignet. Man sollte sie allerdings vermeiden.
Das du unions in C# nicht verwenden kannst könnte damit zusammenhängen das C# diese nicht unterstützt. Ansonsten greifst du auf eine Struktur genau wie in C++ zu. Du deklarierst eine Variable von dem Typen deiner Struktur und greifst per .-Operator auf die einzelnen Variablen zu.

Zu diesem "char analogText[9];" so ist es in einer union ja so, das die union so viel Speicher reserviert wie die größte von ihr verwaltete Variable an speicher benötigt. Du kannst also sämtliche Datentypen in einer union benutzen. Also ich sehe da kein Problem bei der Benutzung von "char analogText[9];" bzw. sehe ich keine Probleme mit dem Speicher. Es sieht nämlich nicht so aus als wenn diese Variable am größen wäre und selbst wenn wäre dies auch kein Problem.

Code-Hacker

C
980 Beiträge seit 2003
vor 20 Jahren

Ansonsten gibts auch ein LayoutKind.Union afaik..

P
939 Beiträge seit 2003
vor 20 Jahren

LayoutKind.Explizit heisst es. Die Position der einzelnen Felder gibt man mit FieldOffset an.

Beispiel:

[StructLayout(LayoutKind.Explicit)]
public struct UnionStruct {
    [FieldOffset(0)] public short Short;
    [FieldOffset(0)] public byte  Byte0;
    [FieldOffset(1)] public byte  Byte1;
}

Edit:
Array-Elemente direkt in eine Struktur einbetten geht so.

public struct ArrayStruct {
   [MarshalAs(UnmanagedType.ByValArray, SizeConst=9)] 
   public char[] charArray;
}