|
|
base workspace aus funktion abfragen |
|
Jensen87 |
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 16.05.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.09.2011, 16:11
Titel: base workspace aus funktion abfragen
|
|
Guten Tag Zusammen,
ich komme mit den verschiedenen Workspace - Arten in Matlab nicht klar.
In meinem GUi möchte ich per Mausklick auf einem PushButton den base workspace abfragen, um nachher auf Existenz bestimmter Variablen zu testen.
Da ich mich in der Callback Funktion des PushButtons befinde, erhalte ich mit
logischerweise nur eine cell mit "eventdata", "hObject" und" handles" zurück.
Wie kann ich also von einer Funktion auf den base Workspace zugreifen?
Danke und schönes Wochenende,
Grüße Jens
|
|
|
|
|
eupho |
Forum-Meister
|
|
Beiträge: 777
|
|
|
|
Anmeldedatum: 07.01.09
|
|
|
|
Wohnort: Marburg
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 24.09.2011, 16:26
Titel:
|
|
Immer wieder die gleiche Frage: Das geht mit evalin() und sollte aus mehreren Gründen vermieden werden (siehe hier etliche Beiträge über die Suchfunktion).
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 24.09.2011, 18:23
Titel: Re: base workspace aus funktion abfragen
|
|
|
|
|
Hallo Jensen87,
Das Konzept der verschiedenen Workspaces scheint immer wieder zu viel Verwirrung zu führen. Man kann zwar in Matlab, wie euphop schon sagte, per EVALIN und ASSIGNIN in "fremde" Workspaces schreiben. Aber diese Art der ferngesteuerten Variablen-Zugriffe ist eine Quelle von Bugs. Diese zu finden ist schiwerig bis unmöglich. Ein Beispiel:
Das ist zumindest das Verhalten in Matlab 2009a: Während das M-File eingelesen wird, wird angenommen, dass "max" die builtin Funktion ist. Der Befehl "whos" liest aber die dynamisch erzeugte Tabelle der Symbole ein und die in der Subfunktion erzeugte Variable wird zuerst gefunden. Das ist zwar konsistent und reproduzierbar, aber doch ziemlich schräg. Wenn man die Maus über den Term "max" hält erscheint der Tooltip "max: [1x1] double 10", sodass das Resultat von "disp(max(a))" nicht mehr nachvollziehbar ist.
Und das ist noch ein harmloses Beispiel, das man mit ein paar zusätzlichen EVALs so weit aufbohren könnte, dass kein Matlab Crack mehr vorhersagen könnte, was das Programm tun wird.
Also: Finger weg von EVALIN und ASSIGNIN. Die ganz normale Weitergabe von Variablen per Input und Output wie in den meisten Programmiersprachen ist effizient, sauber, eindeutig und damit leicht zu debuggen.
Viele Grüße, Jan
|
|
|
Jensen87 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 16.05.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.09.2011, 21:44
Titel:
|
|
|
|
|
Hi Jan,
danke für die ausführliche Antwort.
Habe die letzten Stunden mehreres probiert, jedoch nicht 100% mit Erfolg. Problem ist weiterhin, dass ich nicht an den aktuellen Wert der Variable, die im base steht, komme.
Ich habe mich mal anhand folgendem Link versucht:
http://www.gomatlab.de/alle-variabl.....es-uebergeben-t17516.html
Diese Problematik ist meiner Problematik sehr ähnlich. Demnach hab ich folgendes gemacht:
Das ganze hat auch funktioniert, nur leider mit einer Einschränkung. Das GUI wird ja folgendermaßen aufgerufen test(testvar). testvar wird vom Workspace in die Funktion eingelesen. Mit setappdata und getappdata hol ich mir den Wert von testvar in die callback funktion des PushButtons. Bisher lief es, wie ich es mir vorgestellt habe.
Wenn ich aber nun über z.b. clear den workspace lösche, oder für testvar über das Command Window einen anderen Wert eingebe, wird dieser neue Wert nicht ins GUI aktualisiert. Bei Drücke des Push Buttons erhalte ich immer noch den Wert, den er beim Öffnen des GUI eingelesen hatte. Kann ich das so programmieren, dass dieser Wert ständig aktualisiert wird?
Oder sollte ich diese Sache generell anders angehen, ausser natürlich mit evalin??
Danke und Gute Nacht,
Jens
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 24.09.2011, 23:40
Titel:
|
|
Hallo,
Zitat: |
Wenn ich aber nun über z.b. clear den workspace lösche, oder für testvar über das Command Window einen anderen Wert eingebe, wird dieser neue Wert nicht ins GUI aktualisiert. |
Das ist ja nun normal auch nicht Sinn der Sache. Üblicherweise nimmt man die Veränderungen für eine GUI in der GUI selber vor. Du könntest es z.B. so machen, dass sich auf Knopfdruck ein questdlg öffnet, in dem du einen neuen Wert eingeben kannst.
Grüße,
Harald
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 24.09.2011, 23:55
Titel:
|
|
Hallo Jensen87,
Eine GUI über Befehle im CommandWindow "fernzusteuern" ist schwierig. Um die Daten zu löschen würde ich einen "Clear" Button im GUI erwarten. Aber um neue Daten aus dem CommandWindow zu übernehmen ist wohl EVALIN notwendig.
Hilft LINKDATA weiter?
Man könnte auch eine Funktion zum GUI hinzufügen, bei der ein Aufruf mit einem Wert bei schon existierendem Fenster die Daten updated.
Gruß, Jan
|
|
|
Jensen87 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 30
|
|
|
|
Anmeldedatum: 16.05.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 26.09.2011, 14:42
Titel:
|
|
Hallo Jan,
nein, linkdata hilft nicht weiter.
Hab es momentan mit evalin realisiert. Ist aber nicht ganz zufriedenstellend, da evalin bei Nicht-Existenz der Variable auch einen Error bringt...
Wie könnte denn eine solch eine Funktion aussehen, von der du im letzten Post geschrieben hast? Ich habe grad gar keine Idee.
Schöne Grüße
Jens
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 26.09.2011, 15:35
Titel:
|
|
Hallo Jensen87,
Eine Funktion in Grundzügen, die Daten manuell an GUI weitergibt:
Wenn die Daten per SETAPPDATA gespeichert werden, natürlich auch damit. Oder per "set(FigH, 'UserData', Value'), oder wie auch immer.
Gruß, Jan
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
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.
|
|