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

Variablen in anderen Workspace übergeben

 

simmizi
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 02.10.13
Wohnort: Hannover
Version: R2012b
     Beitrag Verfasst am: 02.10.2013, 16:40     Titel: Variablen in anderen Workspace übergeben
  Antworten mit Zitat      
Hallo!
Ich habe ein recht umfassendes Programm in Matlab geschrieben. Um es zu starten wird das Haupt M-File gestartet und darin alle weiteren Funktionen und GUI's aufgerufen. Jetzt wollte ich das ganze mit dem Matlab Compiler kompilieren, doch dieser erlaubt ja keine Skriptfiles die mit dem base-Workspace arbeiten. Manche Callbacks der GUI's geben derzeit Werte an den base-Workspace mittels assignin() zurück. Dies muss ich ja dann ändern wenn ich keinen base-Workspace mehr habe. Aus der Hauptdatei habe ich jetzt eine Funktion gemacht aber jetzt klappt das alles mit der Variablenübergabe nicht mehr. Auch mit assignin('caller',...) klappt es nicht weil die Hauptfunktion anscheinend nicht der caller ist. Ich hoffe das war verständlich.

Was für Möglichkeiten habe ich denn?
Notlösung wären global Variablen aber das würde ich gerne vermeiden.

Vielen Dank!
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: 02.10.2013, 22:49     Titel: Re: Variablen in anderen Workspace übergeben
  Antworten mit Zitat      
Hallo simmizi,

Das sind die typischen Probleme, wenn man Variablen mit ASSIGNIN magisch in den Workspaces herumschubst. Ich rate grundsätzlich davon ab, da das meiner Ansicht nach noch deutlich schlechter ist als GLOABLs. Denn dann hat man wirklich keine Möglichkeit mehr nachzuforschen, woher eine Änderung der Variablen stammt.

Eine saubere Lösung wäre die Daten per GUIDATA oder SETAPPDATA / GETAPPDATA (hallo Harald!) lokal im FIGURE-Objekt des GUI zu speichern. Für die Benutzung muss dann nur noch der Handle des GUIs bekannt sein und die genannten Funktionen können die Daten aus der Figure erhalten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
simmizi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 02.10.13
Wohnort: Hannover
Version: R2012b
     Beitrag Verfasst am: 03.10.2013, 10:08     Titel:
  Antworten mit Zitat      
Hey,

ich habe gerade mal die Befehle in der Matlab Hilfe nachgeschaut.
Für guidata steht dort:
'guidata can manage only one variable at any time'
Ich habe allerdings bestimmt 30 Eingabefelder. Stoße ich mit diesem Befehl also an die Grenzen oder heißt das, dass ich den Befehl einfach 30 mal ausführen muss?


Vielleicht noch kurz als Info: In meinem GUI habe ich viele Edit-Boxen. Die Eingabedaten schicke ich dann mittels Buttonpress als assignin zurück an den base Workspace damit mein Hauptprogramm damit arbeiten kann.
Der Code steht also in der Callback function meines Buttons:
Code:
assignin('base','L_c',str2double(get(handles.L_c,'String')));


Die Matlab Hilfe hält sich auch sehr kurz bei der Beschreibung von setappdata und getappdata und Beispiele gibt es auch nicht. Was wäre der richtige Ansatz? Alle assignin durch setappdata ersetzen und in der Hauptfunktion mittels getappdata abrufen?
Ist das handle, welches ich bei letztgenannten Befehlen angeben muss einfach figure1?

Vielen Dank vorab!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.10.2013, 10:30     Titel:
  Antworten mit Zitat      
Hallo,

Jan, du hast gerufen? ;)

Zitat:
heißt das, dass ich den Befehl einfach 30 mal ausführen muss?

Ja. Die elegantere Variante wäre allerdings, dass du die Informationen zunächst zusammenfasst, beispielsweise als Struktur.

Zitat:
Die Matlab Hilfe hält sich auch sehr kurz bei der Beschreibung von setappdata und getappdata und Beispiele gibt es auch nicht.

Gibt es schon, nur leider nicht aus der Doku von setappdata/getappdata verlinkt. Hier ein Überblick über alle Wege, Daten in GUIs zu verwalten.
http://www.mathworks.com/help/matla.....-data-in-a-guide-gui.html
Die bevorzugten Wege sind "Application Data" und "GUI Data". Welches von beiden man nimmt, ist Geschmackssache. Ich bevorzuge ersteres, weil es sicherer ist.

Zitat:
Alle assignin durch setappdata ersetzen und in der Hauptfunktion mittels getappdata abrufen?

Ich würde es bevorzugen, die Daten erst z.B. in einer Struktur zu organisieren und dann in ihrer Gesamtheit abzulegen bzw. abzurufen.

Zitat:
Ist das handle, welches ich bei letztgenannten Befehlen angeben muss einfach figure1?

Wenn du das Tag des Fensters nicht geändert hast: ja.

Eine effiziente Möglichkeit zum Auslesen aller edit-Felder:

Code:
all_edit = findobj('Style', 'edit');
tags = get(all_edit, 'Tag');
values = get(all_edit, 'String');
for I = 1:numel(tags)
    data.(tags{I}) = str2double(values{I});
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
simmizi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 02.10.13
Wohnort: Hannover
Version: R2012b
     Beitrag Verfasst am: 15.10.2013, 08:17     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Antwort. Ich habe mir mal den Beitrag über die verschiedenen Möglichkeiten der Variablenweitergabe durchgelesen. Aber irgendwie bezieht sich der Artikel ja mehr auf die Weitergabe innerhalb eines Gui. Wie komme ich jetzt mit getappdata/setappdata an die Daten im base/anderen-workspace heran?
getappdata greift ja auf das figure handle zu also z.b. figure1. Dieses ist ja nur im lokalen Workspace verfügbar. Was wäre denn der einfachste Weg zugriff auch im base-Workspace oder einem Workspace einer anderen Funktion zu erhalten?
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: 15.10.2013, 11:46     Titel:
  Antworten mit Zitat      
Hallo simmizi,

Gib der Figure einen eindeutigen Tag, z.B. 'QWEFigure'. Dann:
Code:
FigH = findobj(allchild(0), 'flat', 'Tag', 'QWEFigure');
AppData = getappdata(FigH);


Eine andere praktische Möglichkeit wäre es, im GUI eine Output-Funktion zu definieren, in der dioe ApplicationData zurückgegeben werden. Dann könnte man das M-File des GUIs aufrufen und die Ausgabe abfangen. Wie das genau mit GUIDE funktioniert, weiß ich nicht. Aber suche doch mal im M-File nach Hinweisen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
simmizi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 02.10.13
Wohnort: Hannover
Version: R2012b
     Beitrag Verfasst am: 15.10.2013, 20:51     Titel:
  Antworten mit Zitat      
Hey vielen Dank!
Das werde ich mal ausprobieren. An welche Stelle setzt ich denn deinen Codeschnippsel? Mittels waitfor() wartet mein Hauptskript bis das GUI geschlossen wird bzw. ich den 'Run'-Button drücke. Dann würde ich deinen Code intuitiv jetzt auch in den Callback dieses Buttons einfügen...oder doch ins Hauptfile? Aber findet Matlab dann auch mein figure-GUI-Objekt?!?

Output function wäre auch eine Option. Gerade verwende ich allerdings schon einen Rückgabewert...

Danke!
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.