LabVIEWForum.de - Union in LabVIEW

LabVIEWForum.de

Normale Version: Union in LabVIEW
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo allerseits

Ich bin noch Anfänger im Umgang mit LabVIEW und habe gerade ein kleines Problem, für das ich zwar eine Lösung weiss, jedoch nur eine, welche micht nicht vollständig zufriedenstellt:

Ich habe mehrere Cluster welche einen unterschiedlichen Aufbau haben. Ebenso ist die Anzahl der Cluster nicht fest vorgegeben. Ich möcht nun diese Cluster in eine Reihenfolge bringen, wozu ich aber kein Array gebrauchen kann, da die Cluster ja unterschiedlich sind. Meine unelegante Lösung des Problem besteht bisher darin, das ich den Aufbau der Cluster vereinheitliche und nur die Elemente der Cluster verwende, welche ich eigentlich benötige. Jeder Cluster hat also Elemente, die gar nicht nötig wären. So kann ich die Cluster in ein Array ablegen. Über ein weiteres Array mit Identifizierungswerten kann ich dann den eigentlich Typ der Cluster bestimmen und weiss so, welche Daten in jedem Cluster überhaupt relevant sind. In C++ könnte ich dieses Problem elegant mit einer Union umgehen. Etwas ähnliches habe ich bisher in LabVIEW allerdings nicht entdeckt. Gits es so was oder weiss einer eine schönere Lösung für mein Problem?

Grüsse
R. Thaller
Evtl. könntest du deine Daten mit "FlattenToString" bearbeiten und dann in ein String-Array ablegen. Zum richtigen Interpretieren könntest du dem String einen Header als Typinformation (z.B. dreistellige Zahl-/Buchstabenkombi) voranstellen und dann an der Auswertestelle erst diesen Header abfragen und entsprechende Cases ("XYZ", "03F", o.ä.) ausführen
Um unterschiedliche Datentypen auf ein allgemeines Einheitsformat zu bringen, wurde von Microsoft der Datentyp "Variant" eingeführt. Das gibt es auch LabVIEW, und vielleicht ist die von Dir erwähnte "Union" in C++ im Prinzip dasselbe.
[attachment=8150]
Union ist ein "Speichermanagementsystem". Damit ist es möglich, mit Variablen unterschiedlichen Typs auf den SELBEN Speicherbereich zuzureifen. In LV ist dieses Feature nicht implementiert.

Ich würde die Methode des überdimensionierten Clusters beibehalten. Oder ein System mit "funktionalen VIs" schaffen, dass je nach Eingangsenumerator am Ausgang den entsprechenden Typ liefert (durch expliziete Extrahierung aus dem überdimensionierten Cluster).
' schrieb:Union ist ein "Speichermanagementsystem". Damit ist es möglich, mit Variablen unterschiedlichen Typs auf den SELBEN Speicherbereich zuzureifen. In LV ist dieses Feature nicht implementiert.

Danke für die Richtigstellung, in C bin ich mit meinen Übungen über "Hello World" nicht viel hinausgekommen.

Aber trotzdem Anfängerfrage: Was Du beschreibst, ist doch genau das, was man in LV mit Type-Casting (Typenformung) auch tun kann. Also z.B kann man damit Typ U32 im Speicher umdeuten in 2 * U16. Deine Beschreibung für das "Speichermanagementsystem" in C++ würde doch hierauf genau passen! Inwiefern ist das Type-Casting in LV etwas anderes?
' schrieb:Was Du beschreibst, ist doch genau das, was man in LV mit Type-Casting (Typenformung) auch tun kann. Also z.B kann man damit Typ U32 im Speicher umdeuten in 2 * U16. Deine Beschreibung für das "Speichermanagementsystem" in C++ würde doch hierauf genau passen! Inwiefern ist das Type-Casting in LV etwas anderes?
Im Prinzip ist das richtig. Man könnte ein Union durch TypCast ersetzten - aber nicht immer.

Der Hauptunterschied ist, dass man eben nichts machen muss. Ein Typcast wäre explizit, mit union ginge das implizit - also ohne einen Text (so in der Art int32(Argument)) hinschreiben zu müssen. Eine weitere Möglichkeit ist, ohne irgendwelche Schwierigkeiten z.B. auf das dritte Byte eines I32 zugreifen zu können. Ein I32 ist dann praktisch ein "Array[0..3] of byte". Auf das dritte Byte zuzugreifen, geht mit TypCast nicht (da braucht man dann schon shl und and etc.). Außerdem kann man mit Union "Typcast machen", die mit TypCast möglicherweise gar nicht gehen - Boolean nach Pointer (um nur ein Beispiel zu nennen).

Unter .NET sollen unions angeblich nicht mehr funktionieren.
Referenz-URLs