LabVIEWForum.de
Array leeren - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Array leeren (/Thread-Array-leeren--18153)



Array leeren - Lupin - 08.02.2011 17:41

Gibt es eine Möglichkeit ein Array komplett zu leeren?
Ich möchte nicht ein Konstante am Blockdiagramm anlegen, da es sich um ein Array von Clustern handelt, die selbst einiges Elemente enthalten und daher mMn nur das Blockdiagramm zumüllen. Das selbe gilt für das Frontpanel.
Ich könnte natürlich mit "Initialize Array" ein leeres erzeugen, aber dann habe ich auch wieder irgenwo den Cluster rumliegen. Ein Element aus dem alten Array raus zu holen und das an "Initialize Array" zu füttern kommt mir auch etwas übertrieben vor (und macht vor allem ein Problem, wenn das Array schon leer ist!).
"Array Subset" oder "Delete From Array" sind noch das nächste das man verwenden könnte, brauchen aber auch mehr als nötig. Gibt's noch was besseres?


RE: Array leeren - jg - 08.02.2011 18:24

Umsteigen auf LV2010: Da kannst du von einer Cluster-Konstanten im BD ein Symbol anzeigen anstatt des gesamten Cluster.

Gruß, Jens


RE: Array leeren - Turbo - 08.02.2011 18:26

Hi,
probier mal im Blockdiagramm rechte Maustaste auf dein Array - Erstellen - Eigenschaftsknoten - Wert, dann Rechtsklick auf Knoten - alle in Schreiben ändern, dann Rechtsklick auf den Anschluss - Erstellen - Konstante

Hoffe, dass das die Lösung für dein Problem sein könnte...


Gruß Turbo


[attachment=32191]
Ach wer lesen kann is klar im Vorteil, sehe gerade dass du ja eben keine Konstante in deinem Blockdiagramm haben willst.

Tja, falls du nicht gerade die 2010-Version zur Hand hast, würde ich aus meiner Lösung ein sub-vi erstellen...


RE: Array leeren - GerdW - 08.02.2011 20:29

Hallo Lupin,

Zitat:Ein Element aus dem alten Array raus zu holen und das an "Initialize Array" zu füttern kommt mir auch etwas übertrieben vor (und macht vor allem ein Problem, wenn das Array schon leer ist!).
Kannst du das "Problem" näher erläutern? Ich sehe da keins...

Zitat:Gibt's noch was besseres?
Ja, die Konstante selbst!

Zitat:mMn nur das Blockdiagramm zumüllen
Mach ein subVI daraus und nach Möglichkeit auch ein TypeDef.

Zitat:Gibt es eine Möglichkeit ein Array komplett zu leeren?
Case-Struktur mit "Default if unwired"-Ausgang würde auch gehen...


RE: Array leeren - Lucki - 09.02.2011 07:17

Das leere Array ist doch der normale Defaultwert. Rücksetzen auf Standard mit Methodenknoten "Standard wiederherstellen"


RE: Array leeren - macmarvin - 09.02.2011 09:07

[attachment=32196]

Ich benutze meist die erste Methode... bei der zweiten "sah" es aber in einem Anwendungsfall so aus, als ob der MemoryManager das lieber bzgl. Buffer-Reuse mochte.


RE: Array leeren - Lucki - 09.02.2011 11:44

Es herrscht ja hier eine ganz schöne Begriffsverwirrung. In Labview versteht man unter einem leeren Array ein Array mit 0 Elementen. Hier aber verstehen manche darunter ein Array, bei dem alle numerischen Elemente den Wert Null haben.
Was von beiden Lupin will, ist unklar. Es sollte nun langsam mal klar gesagt werden.


RE: Array leeren - Falk - 09.02.2011 19:31

(08.02.2011 18:24 )jg schrieb:  Umsteigen auf LV2010: Da kannst du von einer Cluster-Konstanten im BD ein Symbol anzeigen anstatt des gesamten Cluster.

Ja darüber bin ich auch vor 2 Tagen gestolpert. Echt Klasse. Alternativ die Konstante einfach in ein Control umwandeln und dieses auf dem Front Panel verstecken.


Schöne Grüße
Falk


RE: Array leeren - Lupin - 11.02.2011 21:43

(scheint, dass ich seit der Forumsumstellung keine automatischen Email-Benachrichtigungen mehr bekomme und selbst abonnieren muss)

Zitat:Was von beiden Lupin will, ist unklar. Es sollte nun langsam mal klar gesagt werden.
Also mit leerem Array meine ich natürlich LabVIEW gemäß eines mit 0 Elementen. Ich habe ja auch von einem Cluster-Array geschrieben. Damit sollte klar sein, dass es nicht um auf 0 setzen geht.

Zitat:Mach ein subVI daraus und nach Möglichkeit auch ein TypeDef.
Wie könnte ich ein SubVI schreiben, das für jegliches Array, egal welchen Typs funktioniert? Polymorph ok, aber da muss ich ja trotzdem für jeden Typ ein SubVI erzeugen. Klar für genau dieses eine Mal könnte ich es machen. Aber ich hatte den Fall schon einige Male.

Zitat:Array - Erstellen - Eigenschaftsknoten - Wert
Das mit dem Property-node geht an der Lösung vorbei. Ich möchte ja eben gerade KEINE Konstante am Blockdiagramm. Außerdem gibt es zu dem Array kein Frontpanel-Objekt, da es On-The-Fly zusammengebaut wird.

Zitat:Kannst du das "Problem" näher erläutern? Ich sehe da keins...
Aja, stimmt. Hatte kurz vergessen, das ein Zugriff auf ein nicht existierendes Array-Element ja dessen Default-Wert zurück gibt. Da ist also nur noch, dass man mehrere Funktionen braucht um ein Array zu leeren. Mir geht's darum, ein möglichst übersichtliches Blockdiagramm zu haben, bei dem man nicht überlegen muss "was macht die Funktion mit diesen Parametern".

Zitat:Umsteigen auf LV2010: Da kannst du von einer Cluster-Konstanten im BD ein Symbol anzeigen anstatt des gesamten Cluster.
Iin dem Fall hänge ich bei LV2009.

Zitat:Alternativ die Konstante einfach in ein Control umwandeln und dieses auf dem Front Panel verstecken.
Ja, das habe ich auch schon gemacht. Das kommt noch am ehesten an das ran, was ich möchte. Es ist mir aber schon mal passiert, dass ich unabsichtlich im Control des Arrays ein Element initialisiert habe. Wenn das FP-Objekt dann auch noch versteckt ist, sucht man lang, wenn plötzlich das Programm spinnt. Und bei einer Änderung der Cluster-Zusammensetzung muss ich das FP-Objekt mitanpassen (gilt für eine Konstante ebenso). Natürlich könnte man eine Typedef nehmen, aber das Array (und die enthaltenen Cluster) werden On-The-Fly zusammen gebaut und es gibt nirgends ein Frontpanel-Objekt dazu.


Also ich werde es am ehesten mit einer Case-Struktur mit "return default if unwired" machen, bei der immer der unwired Case aufgerufen wird. Das mit dem Diagramm disable würde mir noch besser gefallen, da dabei ja im kompilierten Code gar keine Fallunterscheidung gemacht werden muss, aber wenn es dabei dann andere Performanceeinbußen gibt, lieber doch nicht. Es ist zwar alles ein "workaround", aber das scheint mir der auf Anhieb am schnellsten zu erfassende zu sein.


RE: Array leeren - macmarvin - 14.02.2011 11:16

(11.02.2011 21:43 )Lupin schrieb:  .... Wenn das FP-Objekt dann auch noch versteckt ist, sucht man lang, wenn plötzlich das Programm spinnt. Und bei einer Änderung der Cluster-Zusammensetzung muss ich das FP-Objekt mitanpassen (gilt für eine Konstante ebenso). Natürlich könnte man eine Typedef nehmen, aber das Array (und die enthaltenen Cluster) werden On-The-Fly zusammen gebaut und es gibt nirgends ein Frontpanel-Objekt dazu.


Also ich werde es am ehesten mit einer Case-Struktur mit "return default if unwired" machen, bei der immer der unwired Case aufgerufen wird. Das mit dem Diagramm disable würde mir noch besser gefallen, da dabei ja im kompilierten Code gar keine Fallunterscheidung gemacht werden muss, aber wenn es dabei dann andere Performanceeinbußen gibt, lieber doch nicht. Es ist zwar alles ein "workaround", aber das scheint mir der auf Anhieb am schnellsten zu erfassende zu sein.


Hart gesagt: Zu jedem Cluster gehört ein Typedef (Afaik gibt's da nur eine Ausnahme, Q'n'D Sortierungen)! Alles andere ist Gebastel.

Ob du Disable Struktur oder ist Case-struktur mit Konstante nimmst ist afaik egal. Da wird im Kompilat keine Fallunterscheidung gemacht, der Code im "ausgeschalteten" Teil wurde eh beim builden raus geschmissen.