LabVIEWForum.de - 2D Array erstellen; Anzahl Zeilen abhängig von Cases

LabVIEWForum.de

Normale Version: 2D Array erstellen; Anzahl Zeilen abhängig von Cases
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo zusammen,
ich habe eine Frage an Euch: Ich muss ein 2D-Array erstellen. Dieses Array kann zwischen 0 und 8 Zeilen haben, und hat dann 9 Elemente in der Breite.
An sich kein Problem.
Aber: Ob eine Zeile erstellt wird, hängt von einer Case-Struktur ab.
Ich habe jetzt 3 verschiedene Varianten in das Angehängt VI programmiert:

1. Built Array: Wird mit einem NULL 2D-Array initialisiert und die einzelnen Elemente aus den Cases werden angehängt. Für mich leider untauglich, weil er hier immer 8 Zeilen macht, und dann alle Elemente auf 0 setzt.

2. Insert into Array(außen): sieht schon besser aus, aber wenn ich z.B. Case1-2 auf false setze und Case3 auf true macht er mir wieder die 1. und 2. Zeile mit 0en voll.

3. Insert into Array(in den Cases): Hier habe ich die Insert-Funktion in die Cases gezogen, und schleife im false-Fall das vorherige Ergebnis einfach durch, oder hänge im true-Fall eine neue Zeile an. Das Ergebnis ist genau das was ich brauche.

Aber: Geht das auch schöner, als so wie ich das mache? Ich habe ein bischen Angst, wegen der Zeit. Da kommt noch einiges vorher und nachher in der Schleife, und ich habe insgesamt 25ms pro Schleifendurchlauf Zeit...



Nächste Teilfrage: Was passiert hier eigentlich mit dem Speicher von den Arrays? Holt er sich einmal die Größe die er braucht, und überschreibt den Speicher immer wieder, oder holt er sich bei jedem Schleifendurchlauf neuen Speicher?

Danke und Gruß
Dommas

LV2009 SP1
Hallo Dommas,

zum Bauen eines Arrays (bei überschaubarem Umfang) verwende ich sowas hier:
[attachment=28847]

Schieberegister sind dazu da, sich Werte aus vorangegangenen Iteration zu merken. Dein VI dürfte da etwas Probleme gehabt haben...

"Nächste Teilfrage: Was passiert hier eigentlich mit dem Speicher von den Arrays? Holt er sich einmal die Größe die er braucht, und überschreibt den Speicher immer wieder, oder holt er sich bei jedem Schleifendurchlauf neuen Speicher?"
LV holt sich dann die komplette Größe, wenn diese schon vor der Ausführung bekannt ist. (Beispiel: FOR-Loop mit Autoindexing). Ansonsten wird bei jedem BuildArray oder InsertIntoArray ein neuer, größerer Speicherblock angefordert und die Daten kopiert...
Hallo Gerd,

' schrieb:LV holt sich dann die komplette Größe, wenn diese schon vor der Ausführung bekannt ist. (Beispiel: FOR-Loop mit Autoindexing). Ansonsten wird bei jedem BuildArray oder InsertIntoArray ein neuer, größerer Speicherblock angefordert und die Daten kopiert...

Das heißt, in meinem Fall würde er in jedem Schleifendurchlauf mehr Speicherbedarf haben, richtig? Wie kann ich das dann verhindern? Kann ich ein nicht-initialisiertes 2D-Array mit einer maximalen Größe von 8 Zeilen und 9 Elementen definieren?


' schrieb:zum Bauen eines Arrays (bei überschaubarem Umfang) verwende ich sowas hier:

Schieberegister sind dazu da, sich Werte aus vorangegangenen Iteration zu merken. Dein VI dürfte da etwas Probleme gehabt haben...

die Schieberegister brauche ich nicht. Im Gegenteil! Der soll sich ja nichts merken, sondern immer brav die aktuellen Werte holen. Ich überleg mir eher das ganze noch in ein Event-Struct zu packen, und nur bei Änderungen zu reagieren. Dann muss er speichern, aber die alten Werte überschreiben; im Moment wärs tödlich wenn er die alten Werte speichern würde.
Ich brauche hier die unterschiedlichen Case-Schleifen, und muss ja immer die Werte von der einen an die andere übergeben.
Was natürlich ginge ist dass ich mein "insert into" durch das "built" ersetze. Aber das dürfte von der Geschwindigkeit her nichts bringen, oder?

Du baust Dein Array ja auch in der Case. Ich habe gemeint, ob das geht, ohne dass das in der Case stattfindet, sondern einmal für alle Cases.
Hallo Dommas,

"Kann ich ein nicht-initialisiertes 2D-Array mit einer maximalen Größe von 8 Zeilen und 9 Elementen definieren?"
Du willst also ein Array mit einer bestimmten Größe initialisieren, es aber dann doch nicht initialisieren???
Klar kannst du ein Array initialisieren, es hat dann aber schon Werte drin stehen. Die kannst du aber so wählen, dass du evtl. nicht in deinen normalen Daten vorkommende Werte verwendest (z.B. NaN für DBL-Werte)... Dann ersetzt du immer eine Zeile nach der anderen (& musst einen Zähler dafür mitschleppen), und am Ende schneidest du die "unbeschriebenen" Zeilen weg (ArraySubset oder ReshapeArray).

"Was natürlich ginge ist dass ich mein "insert into" durch das "built" ersetze."
Solange du InsertIntoArray nur benutzt, um eine Zeile vor die andere zu packen, ist BuildArray die bessere (weil "natürlichere") Wahl. Geschwindigkeit dürfte bei den wenigen Daten hier gleich sein.

"ohne dass das in der Case stattfindet, sondern einmal für alle Cases."
Da aus einem Case immer ein Wert herauskommen muss (entweder deine Nutzdaten oder ein leeres Array), wirst du auf diese Weise immer Nuller-Zeilen bekommen. Du willst eine Zeile hinzufügen in einem bestimmten Case - dann mach es doch auch in diesem Case...
' schrieb:"Kann ich ein nicht-initialisiertes 2D-Array mit einer maximalen Größe von 8 Zeilen und 9 Elementen definieren?"
Du willst also ein Array mit einer bestimmten Größe initialisieren, es aber dann doch nicht initialisieren???

Im Prinzip ja;)Auch wenn sich das bescheuert anhört.
Wenn es mir hilft, dass er immer auf den gleichen Speicherteil schreibt.


' schrieb:Klar kannst du ein Array initialisieren, es hat dann aber schon Werte drin stehen.

Eben. Das war ja mein Problem, mit den Lösungen wo ich einfach 1D Arrays aus den Cases rausgezogen hab und draußen ein 2D Array draus gemacht hab. Dann müsste ich das 2D Array irgendwie sortieren, und dann die Teile löschen die ich nicht will. Es kann auch sein dass z.B. nur der 3. und 8. Case true sind, also will ich in meinem fertigen 2D Array auch nur 2 Zeilen, mit dem Inhalt des 3. und 8. Cases

' schrieb:Du willst eine Zeile hinzufügen in einem bestimmten Case - dann mach es doch auch in diesem Case...

OK, ich hatte wie gesagt nur Angst, dass ich hier mit meiner Laufzeit Probleme bekommen könnte, und wollte nur sicher gehen, dass es keine elegantere Möglichkeit gibt.


Vielen Dank!
Hallo Dommas,

du machst dir Sorgen, ob LV Zeitprobleme bekommt, weil du Zeilen mit 9 Werten zu einem Array mit maximal 8*9 Werten hinzufügen willst?
Was für einen Rechner benutzt du denn? Einen C64?Smile
das nicht, aber ich muss im 25ms Takt auf den CAN-Bus schreiben. und da hab ich Angst das ich das nicht einhalten kann mit dem ganzen Zeug...
so, habs jetzt noch ein wenig unübersichtlicher gemacht. Sorry deswegen, ich hoffe da blickt noch jemand anderes durch außer mir.

Hab ich jetzt so einen "festen-Array-Speicher", oder wächst der immernoch mit jedem While-Durchlauf?

Lv09_img2



Edit::offtopic2:Verdammt, wie einmal hätte gereicht; wie bekomm ich jetzt das zweite png wieder weg? Und wieso konnte ich meinen vorherigen Beitrag nicht mehr bearbeiten?!Glas2


Edit2:
Hab jetzt noch eine andere Variante gebaut. Die müsste wahrscheinlich ein bischen schneller sein, da ich hier nicht das Array durchsuchen lasse, sondern ihm einfach sag, "schau Dir das 0te Element an, und sag ob das 0 ist", oder?
Hallo Dommas,

pushen ist meist besser als irgendwelche PMs...

Ich verstehe nicht ganz, was du in deiner Schleife so anstellst.
In den Case fügst du immer eine Zeile vor dem Array ein - nimm für diese Operation besser BuildArray (übersichtlicher).
Außerhalb der Cases fügst du immer das leere Array als erstes ein und dann diverse Zeilen vorn-/hintendran... Mal so, mal so??? Warum überhaupt ein leeres Array, wenn du nur anfügst?

Du verwendest nirgends ReplaceArraySubset - nur damit arbeitest du mit einem festen Array & Speicherbereich! Du definierst ein Array (das Dingens außerhalb der Schleife) und in der Schleife ersetzt du dann einzelne Zeilen dieses (fixen) Arrays - das klappt nur mit ReplaceArraySubset!
Offtopic2
' schrieb:Edit::offtopic2:Verdammt, wie einmal hätte gereicht; wie bekomm ich jetzt das zweite png wieder weg? Und wieso konnte ich meinen vorherigen Beitrag nicht mehr bearbeiten?!Glas2
Zu 1.: so:
[attachment=28856]
Zu 2.: Der Timeout zum Editieren ist hier im LVF "relativ kurz", ich glaube, aktuell bei ca. 30 min, muss mal Dennis fragen...

Gruß, Jens
Seiten: 1 2
Referenz-URLs