LabVIEWForum.de - Frage zu Arrays

LabVIEWForum.de

Normale Version: Frage zu Arrays
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,

seit ein paar Tagen muss ich mich mit LabVIEW beschäftigen.
Eigentlich komme ich aus der Java/c/C++ Welt und habe so meine
Verständnis Probleme mit den Arrays von LabVIEW.

Ich gehe davon, dass LabVIEW dynamischeArrays nutzt (leider gibt es hier zu keinerlei
Angaben).

Beim Anlegen eine neuen 1 dimensionalen Arrays hat das Array die Größe q mit dem
Wert 0 (ich nutze uint32).
Mit "In Array Einfügen" lassen sich anscheinend weitere Elemente in ein Array einfügen
(nicht ersetzen). Gibt man kein Index an, wird das Element an das Ende desArrays
angehängt. In unserem Fall wäre die Länge des Arrays dann 2.

Nun zu meinem Problem: Ich habe, um Arrays und Objektorientierung in LabVIEW
zu verstehen, eine Klasse Vector 3D entworfen. Sie Beinhaltet ein
(Kontruktor überschreiben gibt es nicht?!) 1 dimensionales dynamisches Array (statische
Arrays gibt es nicht?!). Das erste Element (Index 0) sollte demnach 0 sein.

Zum Initialisieren (setzen) des Vectors habe ich das Vi "Set" implementiert
(siehe angehängtes Bild).

Den Vector setze ich mit Set und lasse mir die Länge des Vectors ausgeben
(siehe use.png)?
Nach meiner Interpretation von Arrays sollte das Array im Objekt immer größer
werden (+3 bei jeder Schleife), da in set die Integer an das Array angehängt werden.

Was natürlich nicht gewünscht ist.
Allerdings wird das Arrays nicht größer, sondern enthält immer nur die
drei gesetzetn Integer Werte!?

Irgendwie verstehe ich das nicht?

regards
eliot
Ups, ich antworte mir mal selbstWink
Da die Klasse innerhalb der While-Schleife ist,
wird sie immer neu Initialisiert und damit natürlich auch das Array.

Dann wandele ich die Frage mal ab: Wie kann ich ein vorhandenes
Array löschen (clear)?
' schrieb:Wie kann ich ein vorhandenes Array löschen (clear)?
Nichts, also ein leeres Array, zuweisen.

Und mach dir mal keine Sorgen, weil es keine statischen Arrays gibt. Auch statische Arrays würden gemäß des Datenflußprinzips ständig kopiert werden. Ob ein statisches oder ein dynamisches verarbeitet wird, das kommt aufs selbe raus.
' schrieb:Nichts, also ein leeres Array, zuweisen.

Und mach dir mal keine Sorgen, weil es keine statischen Arrays gibt. Auch statische Arrays würden gemäß des Datenflußprinzips ständig kopiert werden. Ob ein statisches oder ein dynamisches verarbeitet wird, das kommt aufs selbe raus.


BTW ist das oben gezeigte Diagramm sonst ok?
Also werden die Arrays tatsächlich immer kopiert,
so dass ich sie immer wieder neu zuweisen muss?

Ist es "good code" wenn man möglichst viel Klassen erledigt?
Bin das einfach so gewohnt von Java/C++.

Oder sind unter LabVIEW andere Methoden/Programmierstile sinnvoller?
Hallo eliot,

das kommt ganz darauf an, was du machen willst... Also: was willst du mit deinem Array machen? Nach dem, was du bisher gezeigt hast, würde ich dir eine FGV aka LV2-style global aka ActionEngine empfehlenCool

Also ich komme bisher ganz ohne LVOOP/Klassen aus - und das auch bei recht großen Programmpaketen. (Habe allerdings auch so meine Probleme mit OOP/Klassen/Methoden, da mir einfach mal der C++/Java/sonstwas-Hintergrund fehlt.)
' schrieb:BTW ist das oben gezeigte Diagramm sonst ok?
Naja, eigentlich nein.
Da sind lauter Wires mit unnützen Ecken und Überschneidungen. Das geht so nicht. Hehe
Außerdem würde ich zum Anhängen das Element "Erstelle Array" verwenden anstelle von "In Array einfügen".

Ansonsten ist es wohl richtig: Wenn du das Feld "Array" (der Name ist auch schlecht gewählt) erweitern willst, muss du es so entbundeln, erweitern und wieder bundeln.

Zitat:Also werden die Arrays tatsächlich immer kopiert, so dass ich sie immer wieder neu zuweisen muss?
Du musst sie nicht neu zuweisen. Das geht ja alles automatisch.
Durch das Entbundeln entsteht eine Datenkopie ("Array"). Mit dieser Kopie wird gearbeitet. Beim Bundeln wird die eben erweiterte Kopie wieder in die Klasse kopiert. Es ist also nicht so, dass über einen Pointer in den Speicher geschrieben wird, der physikalisch immer in der Klasse liegt.
Hinweis:
Ein statisches Array kann man ganz leicht simulieren: Einfach ein dynamisches Array vorbesetzen mit der maximalen Anzahl von Elementen und dann immer "In Array ersetzen" verwenden.

Zitat:Ist es "good code" wenn man möglichst viel Klassen erledigt?
Sag ich mal so:
Guter LV-Code ist dann, wenn das Datenflußprinzip eingehalten ist. Und wenn alles wie es sich gehört sequenziert ist. Am besten noch mit Error-Cluster. Und wenn der Styleguide eingehalten wird.

Zitat:Oder sind unter LabVIEW andere Methoden/Programmierstile sinnvoller?
Da gehts mir wie dem GerdW: Ich hab für Klassen keine Verwendung. Es geht sehr gut ohne.
"Funktionale Globale Variablen" (FGV) sind ein ideales Mittel, um Daten gekapselt zu halten: Kapselung, Properties, private Methoden/Felder etc. - alles ohne OOP mit FGVs möglich. Multithreading geht sowieso automatisch in LV, ohne dass es der Programmierer merkt. Und zum Datenaustausch zwischen unabhängigen Programmteilen gibt es Queues und Melder.

Der OOP-Hintergrund fehlt mir als altem (?) Delphi-Programmierer zwar nicht, Klassen im Lehrbuchstil mach ich aber trotzdem weder in Delphi noch in LV.
Gut oder schlecht kann man nicht sagen. Es ist halt anders.
Aber selbst der Dozent von "LabVIEW Advanced I" hatte damals gesagt, dass er (und seine Kollegen) die Klassen nicht verwendet, obwohl er sich damit auskennt und uns einen kleinen Überblick verschafft hat.
Manche verwenden das einfach um es mal zu probieren, aber brauchen tut man es definitiv nicht.
Ich habe auch schon Großprojekte gemacht, bin aber bisher (Gott sei Dank) ohne Klassen ausgekommen. Ich hatte zwar "Klassen" früher an der Hochschule mal im Rahmen der Informatik-Vorlesung, bin aber nie wirklich durchgestiegen und deshalb auch froh, dass man in LabVIEW ziemlich gut ohne Klassen leben kann.
Wenn Du aber Interesse hast, kann Dir Eugen (eg) bestimmt weiterhelfen. Der verwendet das glaub' öfters mal. Wink

Gruß Markus

' schrieb:Ist es "good code" wenn man möglichst viel Klassen erledigt?
Bin das einfach so gewohnt von Java/C++.
Hallo,

vieln Dank für die vielen Antworten!

Anbei zwei Bilder der funktionierenden Lösung (Neue set Methode und der Use Fall).

Änderungen in Set:

1. Wenn das Array noch nicht initialisiert ist, wird es mit {0,0,0} vorbelegt
(ist nur beim ersten Aufruf von Set nötig).
2. Danach Erfolgt ein Ersetzen, statt anfügen.

Änderungen in Use:
Vector3D wird außerhalb der While-Schleife initialisiert.

Anmerkung: Wenn ich das Array in der Set Methode nicht neu zuweise, funktioniert set
nicht. Es wird also immer eine Kopie des Arrays erzeugt (was nicht gerade performant ist).

Bleibt die Frage nach Kontruktoren: Ist es in LabVIEW möglich Konstruktoren zu implementieren?

regards
eliot
Hi,

drei Elemente an unterschiedlichen Indizes eines Array einzufügen macht man übrigens so:
[attachment=24132]

Man kann das VI nach unten aufziehen. Verbindet man den ersten Index-Eingang und lässt die anderen frei, wird es als fortlaufend nummeriert betrachtet.


Gruß SeBa


PS:
Keine Ahnung ob das einen Performanceunterschied macht.
' schrieb:Anbei zwei Bilder der funktionierenden Lösung (Neue set Methode und der Use Fall).
Hier gebe ich noch folgende Denkanstöße.
Ein Vektor ist ja ein abgeschlossenes Konstrukt im Sinne eines Datensatzes, der immer 3 Werte hat. So gesehen ist es sinnvoll, die drei Werte als Cluster zu handlen. Der Cluster, wie ein Struct in C, repräsentiert dann den Vektor. Mit Cluster würde nur eine Ersetz-Operation nötig sein (in einem Array of Cluster).
Man kann auch innerhalb eines Arrays auch einen ganzen Arrayteil ersetzen. Einfang am Dateneingang ein Array anschließen.

Zitat:Anmerkung: Wenn ich das Array in der Set Methode nicht neu zuweise, funktioniert set nicht. Es wird also immer eine Kopie des Arrays erzeugt (was nicht gerade performant ist).
Das mit dem Bundeln ist vom Datenfluß-Prinzip her nötig.
Hinweis:
Es gibt ein Inplacement-Konstrukt. Das hat die Aufgabe, Speicherallozierungen zu vermeiden. Mit diesem Konstrukt ist es dann tatsächlich möglich in einen bestehenden Speicher zu schreiben.

Zitat:Bleibt die Frage nach Kontruktoren: Ist es in LabVIEW möglich Konstruktoren zu implementieren?
Ein Konstruktor im Sinne, dass man zur Laufzeit ein neues Objekt createn kann (so komplett mit Speicherallozieren etc.), gibt es in LV nicht (mal von einem Verzweigungsknoten abgesehen). Und den Rest, der im Konstruktor steht, wie z.B. das Vorbesetzen von Feldern, das kann man ja mit einem entsprechenden SubVI machen.
Seiten: 1 2
Referenz-URLs