Verfasst am: 18.04.2008, 14:12
Titel: Workspaces und Variablen
Hallo,
ich hätte eine Verständnisfrage. Es geht um die Workspaces und die verwaltung der Variablen in WS.
Ich habe gelesen, dass es 3 verschiedene WS gibts.
Base WS für die Variablen erstellt in Command Window oder Script-M-Files.
Functions WS verwalten die Variablen die innerhalb von einer Funktion benutzt werden. Nach dem Return werden die Variablen gelöscht, so weit sie nicht global definiert sind.
Global WS ist nicht direkt benutzbar. Hier werden die globale variablen abgelegt.
Beispiel: ich habe eine main() funktion, die einen einstieg in das Programm darstelt. Dh. es gibt ein FunktionsWS für diese Funktion. und ich habe andere Funktionnen die von main aus aufgerufen werden. Die returnwerte dieser Funktionen landen aber nicht im WS von main() sondern im Base WS. Natürlich habe ich dann kein zugang zu diesen Variablen/Werten.
Frage: sind meine Annahmen korrekt? Kann man das Verhalten umgehen? Damit ich den Zugriff auf die Variablen bekomme?
dann steht Dir die Variable myoutput in main zur Verfügung, die denselben Inhalt hat, wie die Variable output in myfunction hatte. Meintest Du das mit "returnwerte"?
Im Base Workspace landen die Variablen von myfunction überhaupt nicht. Es sei denn, man wertet sie mit
danke für die Antwort. Ja, die "Returnwerte" hast du korrekt verstanden.
Ist es möglich mittels assignin auch WS von main() anzusteuern? So, dass die dynamisch erzeugte variablen in main WS erstellt werden? Weil genau das war mein Problem, ich hab die Werte nicht normal "returniert" sondern per assignin dynamisch zu einer Variabler gemacht. Somit sind sie im base WS gelandet, und ich hatte keinen Zugrif drauf.
danke für die Antwort. Du hast schon recht, es ist mit der Übergabe von veriablen einfacher. Ich erforsche momentan die möglichkeiten des Matlabs. Wenn ich den Einstiegspunkt des Programms in einem m-Script mache ist es kein Problem die einzelne Returnwerte als wariable zu übergeben. Problematischer wird es, wenn ich den Einstiegspunkt in einer m-Funktion (main.m) ausprogrammiere. So, wird eigentlich mein base-WS in den main-WS verlagert und ich muss alle Returnwerte in main-WS umleiten. Sonnst landen sie im base-WS und kann dann diese Werte vom main-WS nicht zugreifen.
Tja, klingt bischen kompliziert, ich weiss. Ist aber gut zu wissen wie es funktioniert.
Noch eine Frage hätte ich: Ich erstelle Objekte. Sagen wir, ich habe eine Stack-Klasse. Der Name des Objektes setzt sich zusammen von dem Wort 'sta' und dem Wert der Variablen compr. Das mache ich mit folgendem Code. Es läuft ohne Probleme.
Das Problem ist dass ich nicht lösen kann ist, dass ich dann auf dynamisch generierte Var/Objekt nicht vom Code zugreifen kann (sie ist ja nicht bekannt da kein Returnwert 'this' definiert ist). Enfach ausgedruckt, ich will auf einer Seite den namen des Objektes dynamisch generieren und gleichzeitig ein Returnwert mit dem Zeiger auf das entstandene Objekt ausgeben. Ist so was Prinzipiell möglich? Kennst du vielleicht den Weg?
hier ein Beispiel für 'caller'. Es funktioniert gut. Ist ein bisschen umständlich, da man nicht direkt die Objekte sehen kann, resp. ich bin nicht draufgekommen wie ich mir direkt main-WS anschauen kann. Das Objekt wurde aber erstellt und auch der Name wurde dynamisch erzeugt.
Zu meiner vorigen Frage. Ja die Objekte sehe ich und ich kann auf sie über Konsole zugreifen. Da ich aber kein 'Zeiger' = this returniert habe, kann ich vom Script oder Funktionen nicht zugreifen. Versuche mal eine Variable dynamisch zu erzeugen und benutze sie dann gleich weiter im Code. Ob das klappen wird?
ich habe mir schon gedacht, dass es ziemlich verwirrend ist, was ich da schreibe. also ich versuche es noch mal. Versuche mal die Testfunktion auszuführen. Einmal mit 'base'- und einmal mit 'caller'-Argument. Mit 'base'-Argument kannt du die Var sehen (sie befindet sich ja im base-WS) aber die funktion kann sie nicht weiter benutzen. Mit 'caller' argument wird die Funktion ausgeführt, aber man sieht die Variable nicht.
Frage: geht es, dass man eine dynamisch erstellte Variable sieht (base-WS) und gleichzeitig aber in andererm WS mit ihr arbeitet?
vielleicht habe ich es ja jetzt richtig verstanden.
Also:
1. Es gibt einen Base-Workspace, den man vom Command Window und von Skripten aus ansprechen kann. Auch von Funktionen aus kann man über assignin Variablen dort ablegen.
2. Es gibt die lokalen Workspaces von Funktionen. Variablen können über die Funktionsaufrufe ausgetauscht werden und mit assignin explizit in der aufrufenden Funktion ausgewertet werden.
Soweit alles bekannt und geklärt.
3. Es gibt den "globalen Workspace" (weiß nicht, ob der so heißt), in dem die globalen Variablen existieren. Diese kann man in allen Workspaces, in denen sie als global deklariert sind auswerten, ansprechen und sehen. Dies ist gerade die Möglichkeit, workspace-übergreifend zu arbeiten. Eine andere Möglichkeit halte ich für ausgeschlossen. Man könnte zwar die Variable in jedem Workspace einzeln lokal erzeugen, aber dann würde sie die Veränderungen, die nur in einem Workspace passieren, in den anderen nicht mitmachen. Das erlauben gerade die globalen Variablen.
Ich bin ja gespannt, ob ich Dir diesmal befriedigende Antwort geben konnte.
Ich persönlich würd es so machen (aber ich akzeptiere, dass Du etwas experimentieren willst):
a ist jetzt eine struct-Variable, die dynamische Variablennamen (eigentlich Feldnamen) erlaubt. Wenn man die Funktion aus dem Command Window mit a = testvar aufruft, ist die Variable a auch im Base Workspace.
erstmals vielen Dank für dein Gedult und alle Antworten.
Wir sind schon ganz nah dran und deine Lösung gefählt mir gut. Trotzdem habe ich noch eine Frage :
Die dynamisch erstellte 'a.(name)' ist unter 'b' in globalen WS gespeichert. Mit a.(name) kann ich drauf zugreifen. Nehmen wir an, dass ich 4 Variable benötige, 'a.1', 'a.2', 'a.3', 'a.4'. Wie kann man dies so anstellen, dass diese auch unter 'a.1', 'a.2', 'a.3', 'a.4' im main WS erreichbar sind? Wobei die var durch eine for Schleife erstellt werden und die Zahl nach dem Punkt der Durchlaufzähler ist.
das ist ja echt knifflig. Ich bin schon wieder nicht ganz sicher, ob ich richtig verstehe...
Wenn Du mit globalen Variablen arbeitest, heißen die überall gleich. Wenn also das struct 'a' im Base-Workspace und in allen Funktionen als global deklariert wird, so hat man überall Zugriff auf die Variable 'a.(name)'. Man sollte sie auch nicht in eine Variable 'b' umspeichern, da dann eine Veränderung nicht mehr in die anderen Workspaces übergeben wird. Oder man nennt sie überall b, aber dann ist der Name ja wieder nicht dynamisch erzeugt... Kurz gesagt:
in jede Funktion und ins Command Window schreiben.
Die andere Frage ist die nach den vier Feldern. Wenn die Namen allerdings wirklich nur aus Ziffern bestehen sollen, muss man cells statt structs nehmen. Die Feldnamen eines structs müssen die gleichen Anforderungen erfüllen wie Variablennamen. Ich bin jetzt nicht sicher, ob das nur ein Beispiel sein sollte, oder exakt so werden soll, also hier beide Lösungen:
danke für deine Antwort. Also, die globalen variablen versuche ich möglichst zu vermeiden. Diese benutzte ich nur für die Pfadangaben (Log, Settings...).
Die Lösung mit Zellarrays gefählt mir am besten resp. sie ist für mich am besten geeignet. Die dynamischen Felder werde ich in der Zukunft auch benutzten, allerdings, ganz intensiv habe ich mit denen noch nicht aussenandergesetzt.
Ich bedanke mich für deine Unterstützung.
LG Joe
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.