Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
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
A few weeks of developement and testing can save a WHOLE afternoon in the library!
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.
.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu 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 beschreiben) 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 Antwort
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 hier
Habe das Vi leider nicht zur Hand heute, werde es ev. morgen hier posten, wenn es wen interessiert.
A few weeks of developement and testing can save a WHOLE afternoon in the library!
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)
23.05.2008, 09:02 (Dieser Beitrag wurde zuletzt bearbeitet: 23.05.2008 09:04 von Kvasir.)
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.
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.
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.
A few weeks of developement and testing can save a WHOLE afternoon in the library!
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 :-)
Hmmm also entweder ich denk total ums Eck rum, oder ihr versteht nicht, was ich meine
Ich weiß, wie die "Array size" Funktion arbeitet
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
A few weeks of developement and testing can save a WHOLE afternoon in the library!