WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

base workspace aus funktion abfragen

 

Jensen87
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2011, 16:11     Titel: base workspace aus funktion abfragen
  Antworten mit Zitat      
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

Code:


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
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 24.09.2011, 16:26     Titel:
  Antworten mit Zitat      
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).
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.09.2011, 18:23     Titel: Re: base workspace aus funktion abfragen
  Antworten mit Zitat      
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:
Code:
function theMain
a = 1:10;
b = theSubFunction(a);
disp(max(a));   % ==> "max" is a function
whos('max')      % ==> "max" is a variable
end

function theSubFunction(x)
y = max(x);
assignin('Caller', 'max', y);
end

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jensen87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2011, 21:44     Titel:
  Antworten mit Zitat      
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:
Code:
function test_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to test(see VARARGIN)

% Choose default command line output for test
handles.output = hObject

handles.testvar=varargin
setappdata(handles.figure1,'testvar',handles.testvar)


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.09.2011, 23:40     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.09.2011, 23:55     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jensen87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2011, 14:42     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.09.2011, 15:35     Titel:
  Antworten mit Zitat      
Hallo Jensen87,

Eine Funktion in Grundzügen, die Daten manuell an GUI weitergibt:
Code:

function SetData(Value)
FigH = findobj(allchild(0), '-flat', 'Tag', 'TaqgOfYourGUI');
if isempty(FigH)
  % Error, or open the gui?
elseif numel(FigH) > 1
  % warning, choose the first one:
  FigH = FigH(1);
end
handles = guidata(FigH);
handles.Data = Value;

% Start the callback for updating the graphics, if wanted
 

Wenn die Daten per SETAPPDATA gespeichert werden, natürlich auch damit. Oder per "set(FigH, 'UserData', Value'), oder wie auch immer.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.