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

alle Variablen aus Workspace löschen wenn GUI gestartet wir

 

albiknalltuete
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2015, 10:03     Titel: alle Variablen aus Workspace löschen wenn GUI gestartet wir
  Antworten mit Zitat      
Ich würde gerne im gleichen Zug, wenn die GUI gestartet wird, alle Variablen, die vorher durch Einzelberechnungen etc. in den Workspace berechnet wurden, löschen.
Dazu habe ich in die OpeningFcn folgendes geschrieben:

Code:
% --- Executes just before Schnellauswertung is made visible.
function Schnellauswertung_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 Schnellauswertung (see VARARGIN)
% Choose default command line output for Schnellauswertung
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);

% UIWAIT makes Schnellauswertung wait for user response (see UIRESUME)
% uiwait(handles.figure1);

%Fügt einen Ordner/Ordnerstruktur zu Matlab hinzu
clc            %Löscht das Command Window
clearvars all
uiwait(msgbox('Bitte den Ordner "Skript_Schnellauswertung" auswählen, um ihn zu Matlab hinzuzufügen!','Schnellauswertung'));
try        %Auswahl des Ordners mit "uigetdir" und hinzufügen mit "addpath()"
    addpath(genpath(fullfile(uigetdir)));
catch      %Wenn Abbrechen in Ordnerauswahl, Fehlermeldung und Beenden der GUI
   uiwait(errordlg('Der Ordner wurde nicht dem Programm hinzugefügt. Das Skript wird beendet!'))
   close all
end
fid=fopen('Zwischenablage\messgroessen.txt','w');   %Öffnet und löscht den Inhalt der Textdatei
fclose(fid);                                        %Schließt die Textdatei


Zu aller erst wird der Übersichtlichkeit halber das Command Window gelöscht, danach sollen alle Variablen gelöscht werden. Den ersten Befehl ( clc ) führt das Programm aus, aber clearvars all nicht. Die nachfolgenden Befehle werden auch ausgeführt.
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: 19.10.2015, 10:21     Titel: Re: alle Variablen aus Workspace löschen wenn GUI gestartet
  Antworten mit Zitat      
Hallo albiknalltuete,

Warum möchtest Du alle Variablen in welchem Workspace löschen? Jede Funktion hat ihren eigenen Workspace in Matlab. Deshalb löscht das clearvars alle Variablen, die innerhalb der Funktion "Schnellauswertung_OpeningFcn" definiert worden sind. Insbesondere sind das die Inputs. Das halte ich nicht für sinnvoll.

Da man innerhalb einer Funktion sowieso die volle Kontrolle über alle lokal benutzten Variablen hat, halte ich den Versuch "ferngesteuert" in anderen Workspaces Variablen zu löschen für nicht nützlich. Das erschwert nur das Debuggen unnötig. Siehe dazu die riesige Menge an Diskussionen in diesem Forum und dem Internet bzgl. "assignin", "evalin" und der Verwendung "globaler Variablen".

fullfile(uigetdir) bewirkt nichts, da fullfile mehrere Strings so aneinanderhängt, dass die File-Separatoren richtig gesetzt sind. Bei nur einem String geschieht also gar nichts.
Wenn der User aber auf "Cancel" drückt, versucht Matlab Unfug in den Pfad einzubinden.

Statt Ordner in den Pfad einzubinden, ist es deutlich sicherer immer den Absoluten Pfad-Namen für Files und Ordner zu verwenden. Andernfalls wählt Matlab das File aus, dass früher im PATH vorkommt oder im aktuellen Ordner liegt, das kann aber ein anderes sein, als Du beabsichtigst.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2015, 10:40     Titel: Re: alle Variablen aus Workspace löschen wenn GUI gestartet
  Antworten mit Zitat      
Hey Jan

Jan S hat Folgendes geschrieben:
Hallo albiknalltuete,

Warum möchtest Du alle Variablen in welchem Workspace löschen? Jede Funktion hat ihren eigenen Workspace in Matlab. Deshalb löscht das clearvars alle Variablen, die innerhalb der Funktion "Schnellauswertung_OpeningFcn" definiert worden sind. Insbesondere sind das die Inputs. Das halte ich nicht für sinnvoll.

Da man innerhalb einer Funktion sowieso die volle Kontrolle über alle lokal benutzten Variablen hat, halte ich den Versuch "ferngesteuert" in anderen Workspaces Variablen zu löschen für nicht nützlich. Das erschwert nur das Debuggen unnötig. Siehe dazu die riesige Menge an Diskussionen in diesem Forum und dem Internet bzgl. "assignin", "evalin" und der Verwendung "globaler Variablen".


Dann werde ich das lassen. Das hatte ich mir auch schon so ähnlich gedacht., wollte aber auf Nummer sicher gehen, dass wirklich keine vorherige Variable reinfunkt.

Jan S hat Folgendes geschrieben:

fullfile(uigetdir) bewirkt nichts, da fullfile mehrere Strings so aneinanderhängt, dass die File-Separatoren richtig gesetzt sind. Bei nur einem String geschieht also gar nichts.
Wenn der User aber auf "Cancel" drückt, versucht Matlab Unfug in den Pfad einzubinden.

Statt Ordner in den Pfad einzubinden, ist es deutlich sicherer immer den Absoluten Pfad-Namen für Files und Ordner zu verwenden. Andernfalls wählt Matlab das File aus, dass früher im PATH vorkommt oder im aktuellen Ordner liegt, das kann aber ein anderes sein, als Du beabsichtigst.

Gruß, Jan


fullfile habe ich rausgenommen. Da hast du recht.

Den Hintergrund der zweiten Verbesserung verstehe ich nicht. Aber hier nochmal eine Zusatzinformation: Der absolute Pfad ist schwierig, da das Programm innerhalb unserer Abteilung und auch auf dem Server liegen wird. Der Ordner wird jedes Mal neu ausgewählt, da kann eigentlich keine frühere Version drin sein.

Grüße Albi
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: 19.10.2015, 11:36     Titel: Re: alle Variablen aus Workspace löschen wenn GUI gestartet
  Antworten mit Zitat      
Hallo albiknalltuete,

Wenn Du relative Pfad-Namen verwendest, z.B. nur den Namen der Datei selbst, ist dies keine eindeutige Identifikation mehr, falls Dateien /Ordner mit dem gleichen Namen auch an anderer Stelle in Matlab's PATH oder im aktuellen Ordner vorkommen. Sicherer ist es deshalb, den von uigetdir zurückgelieferten Ordner z.B. in den UserData oder ApplicationData (siehe guidata ) zu speichern und dann immer per fullfile diese Ordner für die Definition aller Datei-Namen mit einzubinden.

Es ist z.B. möglich, dass ein Timer- oder GUI-Callback den aktuellen Ordner neu setzt. Wenn Du dann nach "test.mat" suchst, bekommst Du vielleicht irgendwelche Test_Daten, die zu Matlab gehören.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2015, 11:53     Titel: Re: alle Variablen aus Workspace löschen wenn GUI gestartet
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo albiknalltuete,

Wenn Du relative Pfad-Namen verwendest, z.B. nur den Namen der Datei selbst, ist dies keine eindeutige Identifikation mehr, falls Dateien /Ordner mit dem gleichen Namen auch an anderer Stelle in Matlab's PATH oder im aktuellen Ordner vorkommen. Sicherer ist es deshalb, den von uigetdir zurückgelieferten Ordner z.B. in den UserData oder ApplicationData (siehe guidata ) zu speichern und dann immer per fullfile diese Ordner für die Definition aller Datei-Namen mit einzubinden.

Es ist z.B. möglich, dass ein Timer- oder GUI-Callback den aktuellen Ordner neu setzt. Wenn Du dann nach "test.mat" suchst, bekommst Du vielleicht irgendwelche Test_Daten, die zu Matlab gehören.

Gruß, Jan


Danke für deine Hinweise. Ich steige aber noch nicht ganz dahinter, was ich falsch mache, da uigetdir mir keinen relativen, sondern einen absoluten Pfad zurückgibt. Wenn ich also Beispiel:
Code:

eingebe, meinen Ordner " Skript_Schnellauswertung" auswähle und mir dann den "a" anschaue, steht ein absoluter Pfad als String in der Variablen.
Ich werde mich nochmal mit paar Informatiker-Freunden hinsetzen und versuchen mir das erklären zu lassen.
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: 19.10.2015, 15:39     Titel: Re: alle Variablen aus Workspace löschen wenn GUI gestartet
  Antworten mit Zitat      
Hallo albiknalltuete,

uigetdir gibt Dir tatsächlich einen absoluten Pfad aus. Du musst ihn nur später auch benutzen:
Code:
a=uigetdir
fid = fopen(fullfile(a, 'Zwischenablage\messgroessen.txt'),'w');

Und da die Variable "a" nach dem Verlassen der funktion gelöscht wird, muss sie vorher noch z.B. in der Variable "handles" gespeichert werden, so dass man auch aus anderen Callbacks des GUI darauf zugreifen kann:
Code:
handles.Path = a;
guidata(objectH, handles);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2015, 06:48     Titel:
  Antworten mit Zitat      
Hey Jan,

ich glaube jetzt vermischen wir hier einiges.
Mit dem uigetdir öffne ich ein Auswahlfenster und füge die gesamte Ordnerstruktur zu Matlab hinzu. Der Ordner "Zwischenablage" wird dabei mit hinzugefügt, da es ein Unterordner ist.
Ich öffne die Datei messgroessen.txt nur, damit sie leer ist. Diese brauche ich in einer anderen GUI-Funktion als Zwischenspeicher.
Die Variable "a" war nur ein Beispiel, um zu zeigen, dass uigetdir einen absoluten Pfad wiedergibt.
Die GUI ist noch um einiges länger. Es ging mir um die Variablenproblematik und das hast du mir gut erklärt! Smile
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: 20.10.2015, 08:40     Titel:
  Antworten mit Zitat      
Hallo albiknalltuete,

Zitat:
Mit dem uigetdir öffne ich ein Auswahlfenster und füge die gesamte Ordnerstruktur zu Matlab hinzu.

Und genau davon rate ich dringend ab. Der Matlab-PATH ist gut für M-Files, damit sie automatisch gefunden werden, ohne dass man den absoluten Pfad mit angeben muss. Für Daten-Files ist das jedoch tückisch, denn es kann vorkommen, dass mehrere Files mit dem gleichen Namen in unterschiedlichen Ordnern im PATH liegen. Und welches dann gewählt wird, kann man als User kaum überschauen. Das hängt dann nicht nur von der Reihenfolge der Ornder im PATH ab, sondern auch vom aktuellen Ordner.

Wenn man immer absolute File-Namen verwendet, entfällt der Grund Pfade zu User-Daten in den Matlab-PATH zu hängen und damit hat man eine Fehlerquelle weniger. Und da das in sehr vielen Computer-Programmen zu ernsten Fehlern geführt hat (nicht nur bei Matlab, sondern auch sicherheitsrelevante Bugs in Betriebssystemen), ist es grundsätzlich eine gute Idee niemals relative Pfadnamen zu verwenden.

Und, ja, das hatte mit Deiner eigentlichen Frage nichts zu tun.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
albiknalltuete
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2015, 08:50     Titel:
  Antworten mit Zitat      
Hey Jan,

okay ich glaube jetzt habe ich es langsam. Die Datei "messgroessen.txt" ist jetzt nicht mehr vorhanden, da ich eine andere Idee verfolge. Dennoch habe ich zwei Dateien, die ich Zwischenspeicher. Ich würde zu gegebener Zeit mich hier nochmal melden, wenn ich das realisiere.

Grüße Albi
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 - 2024 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.