LabVIEWForum.de
in LV auf dll union zugreifen (struct {union{array;struct{ };BYTE}) - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: in LV auf dll union zugreifen (struct {union{array;struct{ };BYTE}) (/Thread-in-LV-auf-dll-union-zugreifen-struct-union-array-struct-BYTE)



in LV auf dll union zugreifen (struct {union{array;struct{ };BYTE}) - Dommas - 08.06.2011 10:08

Hallo zusammen,

ich muss in Lv09_img2 auf eine dll zugreifen, die u.a. eine Funktion mit folgendem Prototyp enthält:

typedef struct { union { BYTE 1[12]; struct { BYTE 2; BYTE 3[5]; BYTE 4[2]} c} b; BYTE 5} a;

Wenn meine C Kenntnisse richtig sind, dann ist eine Union etwas ähnliches wie eine struct. Mit dem Unterschied, dass eine struct für jedes Element die entsprechende Speichergröße allokiert, eine Union nur die des größten Elements und der Programmierer hat darauf zu achten dass er die Bits im Speicher richtig interpretiert.
Folglich würde ich auf ein Element der struct c nicht wie auf ein Cluster-, sondern wie auf ein Array-Element zugreifen. Und wenn die Union mit struct c befüllt ist nur die ersten 8 Array-Elemente lesen.
Oder baue ich mir in meinem Cluster a, das ich an den dll-Knoten hänge, genau die Struktur nach, wie sie im Prototyp steht? Probieren kann ich es leider (noch) nicht, da die Hardware zur dll noch nicht fertig ist.

Hier mal die beiden Möglichkeiten, von denen ich nicht weiß welche, oder ob überhaupt eine dabei ist die richtig ist.

Danke und Gruß
Dommas

PS: Wieso ist auf dem snippet nur die Hälfte sichtbar?!


RE: in LV auf dll union zugreifen (struct {union{array;struct{ };BYTE}) - rolfk - 09.06.2011 07:46

LabVIEW kennt keine Unions im eigentlichen Sinn. Das nächstliegende dazu in funktioneller Hinsicht sind Variants, aber die haben im Zusammenhang mit der Call Library Node keinerlei Sinn, da dies ein LabVIEW interner komplexer Datentyp ist, den Du von C aus nicht direkt ansprechen kannst.

Wenn Du den Datentyp in LabVIEW nachbaust, musst Du Dich für eine der Varianten entscheiden. Und das ist typischerweise ein fixed length array von der gewünschten Länge an Bytes. Nun hat LabVIEW auch keine echten fixed length Arrays (ausser innerhalb FPGA) und deshalb musst Du das nachbauen mittels einers Clusters der die entsprechende Anzahl unsigned 8Bit Integers enthält.

Dein Datentyp sieht dann so und nicht anders aus:

[attachment=34170]

Im VI musst Du dann je nachdem welcher Type gemeint ist, die entsprechenden Bytes hineine- oder herauskopieren. Möglichkeiten dazu sind direkt mit Bundle oder Array Build und anschliessendes Array to Cluster für Eingangspareameter und Unbundle, oder aber Cluster to Array und danach Array Subset für Ausgangsparameter.


RE: in LV auf dll union zugreifen (struct {union{array;struct{ };BYTE}) - Dommas - 14.06.2011 10:20

Hallo Rolf,

im Moment sieht alles danach aus, wie wenn es mit Deinem Vorschlag funktionieren würde.
Ich kann es wohl in den nächsten Tagen nocheinmal genauer testen, dann werde ich Deinen Post als Lösung markieren.
Bis dahin schon einmal Danke schön!

Gruß
Dommas