LabVIEWForum.de - SubVi - Array kürzen

LabVIEWForum.de

Normale Version: SubVi - Array kürzen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo Leute,

habe heute eine kleine Knobelaufgabe für euchSmile

Problem ist folgendes: Ich möchte mir ein kleines SubVi schreiben, das mir einen Array kürzt. Es soll also bei Auftreten eines bestimmten Elements (variabel, z.B. 0) alle nachfolgenden Elemente wegschneiden, den Array also kürzen. Hintergrund ist der, dass ich den Array öfters ändere (vom User) und es dadurch passieren kann, dass der Array länger als nötig ist. Wenn also der User weniger Parameter eingibt, soll sich auch die Array Länge ändern. Im Frontpanel kann man ja leider nicht (oder kann man??) den Array kürzen, sondern nur die Werte auf z.B. 0 setzen.

Das SubVi schreiben ist eigentlich kein Problem (siehe Screen), allerdings möchte ich es möglichst variabel halten, so dass man nicht nur einen 1D Array anschließen kann, sondern auch 2-, idealerweise n - dimensionale Arrays. Und genau daran scheitere ich. Ich würde dann gerne die 1. Dimension des Arrays verwenden um die Schnittlänge zu erhalten und jede Dimension dann auf diese Länge kürzen.

Hat jemand eine Idee, wie man dies lösen könnte, sodass das SubVi als Eingang beliebig dimensionale Arrays animmt? Ich bekomme stets ein Problem mit den Drähten. Ausreichend wäre eigentlich schon, wenn es 1 und 2 dimensionale Arrays schafft.

Kvasir
Da fallen mir 2 Möglichkeiten ein.

1. Erstellen eines PolymorphicVi. (Datei Neu) Habe ich auch noch nie gemacht, aber so geht es.

2. Wenn du nur 1D oder 2D möchtest, dann machst du einen 2D Eingang.
1D Array müssten zum anschliessen noch mit BuildArray auf 2D erhöht werde.
Im SubVi prüfst du nun ob die 2.Dim. null ist. irgendwie so.

Ich würde es nach Punkt 1 machen.
Ich weiss nicht genau ob ich es verstanden hab.
Also ich glaub ich würde es ein wenig anders machen.
So wie es in Deinem ersten Bild ist sieht es schon gut aus.

Ich würde bei diemensionen in 2 eindimensionale Arrays aufteilen.Das kannste mir "Index array" machen.
Einfach kein Index angeben.
Dann würde ich in dem Array wo die Null sein soll nach 0 suchen so wie Du das auch machst.(dann hast DU ja den Indize)
Und dann würd ich einfach mit "Slit 1D array" deine beide 1d array von der stelle an Splitten die Dein Indize Dir ausgegeben hast.
Und die beiden rauskommenden arrays wieder zu einem 2d array zusammenfügen. das sollte aufjedenfall gehen.
wenns nicht klappt.kannst ja nochmal schreiben.
Ciao FSG
' schrieb:Ich weiss nicht genau ob ich es verstanden hab.
Also ich glaub ich würde es ein wenig anders machen.
So wie es in Deinem ersten Bild ist sieht es schon gut aus.

Ich würde bei diemensionen in 2 eindimensionale Arrays aufteilen.Das kannste mir "Index array" machen.
Einfach kein Index angeben.
Dann würde ich in dem Array wo die Null sein soll nach 0 suchen so wie Du das auch machst.(dann hast DU ja den Indize)
Und dann würd ich einfach mit "Slit 1D array" deine beide 1d array von der stelle an Splitten die Dein Indize Dir ausgegeben hast.
Und die beiden rauskommenden arrays wieder zu einem 2d array zusammenfügen. das sollte aufjedenfall gehen.
wenns nicht klappt.kannst ja nochmal schreiben.
Ciao FSG

Ja das ist schon klar. Das Problem ist (wie ich versucht habe zu beschreibenWink) nicht das Vi für 1D oder 2D Arrays zu schreiben, sondern so zu schreiben, dass es beide Typen als Eingänge akzeptiert. Also von selbst in der Lage ist zu unterscheiden, wie viele Dimensionen vorliegen. Trotzdem danke für deine AntwortSmile

Habe es inzwischen mit dem Polymorphic Vi gelöst. Dachte erst, das ist nicht optimal, da man dabei wählen muss, was anliegt, habe aber bemerkt, dass es sogar automatisch die richtige Instanz auswählt. Kannte diese Methode noch nicht. Man lernt nie aus hierWink
Habe das Vi leider nicht zur Hand heute, werde es ev. morgen hier posten, wenn es wen interessiert.
wenn du es komplett offen halten willst, 1d array als auch 2d array oder md array gibts drei grundsaetzliche moeglichkeiten:
a) polymorphes VI
(einfachste methode, weil -wie du schon bemerkt hast- dir korrekte Instanz per default automatisch ausgewaehlt wird)
wenn du verschachtelungen der einzelnen polymorphen instanzen im menu implementieren willst, verwende folgende syntax xxx:yyy:zzz (der doppelpunkt macht es aus, dass du eine struktur wie bei DAQmx bekommst)
b) reshape array mit einem 1D eingang fuer die nutzdaten und einem weiteren 1D eingang mit den laengeninformationen des urspruenglichen konstruktes, wobei in den einzelnen indizes die laenge der jeweiligen dimension steckt (wobei array length = array dim ist)
(methode wenn man super schlau programmieren will :-))
c) daten in variant datentyp umwandeln (vorteil: nicht nur xD numeric, sondern auch bool und string koennten verwendet werden ohne fuer jeden case eine polymorphe instanz zu generieren). den variant datentyp kannst im subVI in weiterer folge analysieren und in den entsprechenden datentyp zurueck wandeln (in einzelnen cases *dies kann als BD von den einzelnen polymorphen instanzen betrachtet werden)) und deine operation durchfuehren). Der Output ist wiederum ein Variant.
(diese variante ist eine absolute spielerei, aber absolut brauchbar wenn man ueber mehrere VIs hinweg unterschiedlichste daten austauschen muss)
Das polymorphe Vi funktioniert gut soweit. Das mit den : ist auch eine interessante Erweiterung, die ich sicherlich mal brauchen kann.

Mit dem Variant Datentyp hab ich mich auch noch nie beschäftigt, klingt aber interessant.

Deine Variante b) ist "nicht so der Bär" (wie ein Freund von mir zu sagen pflegt). Denn da brauche ich ja erst wieder vor der Funktion (SubVi) Elemente, die mir den Array aufspalten und die Dimensionslängen berechnen. Das wollte ich ja eigentlich alles ins SubVi packen.
Außerdem habe ich bemerkt, dass das nicht so trivial ist, sich die Dimensionslängen zu berechnen, denn wenn du einen 1D Array in das "Arraysize" Element steckst kommt (na-no-na-net) eine Zahl heraus, und eben kein Array! Damit hast du dann wieder das Problem, dass du keine weiteren Funktionen an den (allgemeinen) Ausgang des Arraysize stecken kannst, da du nicht weißt ob ein Array oder eine Zahl kommt.
Was LV hier fehlt (meiner Meinung nach) ist eine kleine Funktion "Array Dimensionen", die sämtliche Schwierigkeiten dieses Problems einfach lösen würde.

Hier noch mein PolyVi:

Lv85_img
[attachment=12640]
[attachment=12639]
[attachment=12641]

edit: bitte beachten lieber Freedrive: Das Symbol meiner Vis ist mit deinem ausgezeichneten Icon Editor erstellt Top1
Hallo,

die Dimensionen von einem Array erhälst Du wenn Du 2 mal Array-Größe hintereinander schaltest.
Die erste Array-Größe sagt Dir wie groß jede einzelne Dimension ist, die zweite wie viele Größen es gibt und das ist die Anzahl der Dimensionen.

kpa
Ja schon aber:

wie ich versuchte zu erklären bekommt man dann ein Problem, wenn der Array auch 1dimensional sein kann. Dann hast du das im Screenshot verdeutlichte Problem.
Was es eben nicht gibt ist eine Funktion, die die Anzahl der Dimensionen ausspuckt egal ob 1D oder mehrD.
BREAK :-)

Die funktion array length ist polymorph, d.h. du kannst jeden xD datentyp anschliessen. (du bekommst den fehler beim mehrfachen hintereinander schalten, weil dein input array nur 1d ist, somit ist der ausgang vom array length scalar)
Als ausgang erhaelst du entweder ein scalar (1d angeschlossen) oder ein 1D (mehr Darray angeschlosen). Jeder index repraesentiert dann eine dimension:
1D -> scalar
2D -> index 0: anzahl zeilen; index 1: anzahl spalten
3D -> index 0: anzahl pages; index 1: anzazahl zeilen; index 2: anzahl spalten
...

Mit diesem hintergrundwissen ist variante zwei sehr einfach :-)
:END BREAK

Hmmm also entweder ich denk total ums Eck rum, oder ihr versteht nicht, was ich meineSmile

Ich weiß, wie die "Array size" Funktion arbeitetWink

Aber ich wollte ja eben selbst ein polymorphes Vi haben. Wo man also jegliche Arrays anschließen kann.

Das ist mit einem polymorphen Vi kein Problem;)aber anders eben schon.

Ob du nun 2 oder n Dimensionen anhängst ist egal, weil aus dem Arraysize immer ein Array als Antwort kommt, mit dem ich dann mit arrayfunktionen weiterarbeiten kann. (z.B. eine zweite Arraysize dranhängen).
Setze ich aber nun ein 1D Array an den Anfang, dann funktioniert nichts mehr, weil eben nur eine Zahl rauskommt und ich mit einer Zahl nicht in die gleichen Funktionen kann wie mit einem Array (auch hier das Beispiel eines zweiten Arraysize).

Klar gibt es Workarounds, aber eleganten habe ich keinen gefunden. Das glaub ich erst, wenn ich ihn sehe. Von den Lösungen als polymorphes und die Variant Methode mal abgesehen.

:BEGIN BREAK

Tongue
Seiten: 1 2
Referenz-URLs