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

handling mit Funktion/übergabe von Daten(offen)

 

mat123lab2
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2015, 16:31     Titel: handling mit Funktion/übergabe von Daten(offen)
  Antworten mit Zitat      
Hi Leute,

ich habe da ein Problem mit meinen Funktionen bzw. der Übergabe. Ich habe eine Oberfläche wo Editfelder sind. Diese Daten will ich in die Datei konfig_data speichern. Wenn ich die Oberfläche starte, möchte ich die Daten aus der konfig_data.m laden können. Speichern geht. Wenn das Programm neu geöffnet wurde, kann ich keine Daten reinladen Sad Es kommt:

Error using handle.handle/set
Invalid or deleted object.

Error in VisuV2>load_kofig_data_callback (line 227)
set(S.edit1,'string','info.fraeser_d');

Error while evaluating uicontrol Callback

Code:
function VisuV2()

clear all;

%% Grafische Oberfläche laden
%load ('konfig_data');
        S.fh = figure('units','pixels',...
              'position',[50 0 330 1024],...
              'menubar','none',...
              'numbertitle','off',...
              'Color',[1 1 1],...
              'name','3D Oberflächentopographie',...
              'resize','off');

        S.txt1 = uicontrol('Style','text',...
                'Position',[20 250 400 500],...
                'string', {' ';...
                            'Werkzeug';...
                            '    ';...
                            '    Durchmesser d:                 mm';...
                             ''},...
                'BackgroundColor',[1 1 1],...
                'HorizontalAlignment', 'left',...
                'FontName', 'Courier',...
                'FontSize', 8);      
 

        S.edit1 = uicontrol('Style', 'edit',...
                'Position', [215 697 50 16],...
                'string','0',...
                'BackgroundColor',[1 1 1],...
                'HorizontalAlignment', 'center',...
                'FontName', 'Courier',...
                'FontSize', 8);  
             
          S.save_konfig_data = uicontrol('style','edit',...
                 'units','pix',...
                 'position',[180 350 125 27],...
                 'String', 'Daten speichern', ...
                 'Style', 'pushbutton',...
                 'HorizontalAlignment', 'center',...
                 'FontName', 'Courier',...
                 'FontSize', 10,...
                 'callback',{@save_kofig_data_callback,S});  
             
          S.load_konfig_data = uicontrol('style','edit',...
                 'units','pix',...
                 'position',[25 350 125 27],...
                 'String', 'Daten laden', ...
                 'Style', 'pushbutton',...
                 'HorizontalAlignment', 'center',...
                 'FontName', 'Courier',...
                 'FontSize', 10,...
                 'callback',{@load_kofig_data_callback,S});
             
          S.schneidgeometrie = uicontrol('Style', 'edit',...
                'Position', [25 315 280 27],...
                'String', 'Schneidgeometrie darstellen', ...
                'Style', 'pushbutton',...
                'HorizontalAlignment', 'center',...
                'FontName', 'Courier',...
                'FontSize', 11,...
                'callback',{@schneidgeometrie_darstellen,S});                    

%save('konfig_data');
end

function [] = load_kofig_data_callback(varargin)
load('konfig_data');
%S = varargin{3};  

    set(S.edit1,'string',info.fraeser_d);

disp(['Konfigurationsdateien aus >>', cd,'\konfig_data.mat<< geladen.'])          
end                    
           

function [] = save_kofig_data_callback(varargin)
% Struktur annehmen
S = varargin{3};  

    % Textfelder einlesen
    info.fraeser_d = get(S.edit1,'string');  
   
% In Datei Speichern
save('konfig_data');
% Ausgeben
disp(['Konfigurationsdateien unter >>', cd,'\konfig_data.mat<< gespeichert.'])          
end  


Hat jemand ein Tipp, was ich falsch machen?? Ich sehe das Problem leider nicht Sad

Gruß Luigi
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: 21.04.2015, 17:40     Titel: Re: handling mit Funktion/übergabe von Daten(offen)
  Antworten mit Zitat      
Hallo mat123lab2,

Lasse als erstes das übele "clear all" weg, denn das löscht neben allem möglichen anderen auch noch die Breakpoints des Debuggers. Alles, was das Debuggen unmöglich macht, ist grundsätzlich eine extrem schlechte Idee beim Programmieren.

Was soll denn im dem File drinn stehen? Zur Zeit sieht es so aus, als wären dort die Handles aus dem Struct S gespeichert. Die sollte man aber besser in den ApplicationData der Figure speichern, denn die sind ja beim nächsten Durchlauf anders.

Du hast den Struct S gar nicht an die Callbacks weiter gegeben. Deshalb kannst Du auch nicht auf S zugreifen. Suche mal im Forum nach "guidata". Dies ist recht praktisch um Daten zwischen verschiedenen Callbacks gemeinsam zu benutzen.

Sobald Du den Debugger nicht mehr mit "clear all" killst, kannst Du ihn verwenden. Z.B. kannst Du ein paar Breakpoints setzen und zeilenweise duirch den Code gehen. Das hilft sehr beim Suchen von Fehlern.

Gruß, Jan

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2015, 18:12     Titel:
  Antworten mit Zitat      
Hi,

danke für die schnelle Antwort. Eigentlich möchte ich nur die Werte vom Editfeldern in der Konfig_data speichern. Anstatt einem Editorfeld sind es bei mir ca.40. Diese Daten möchte ich wegspeichern und bei dedarf wieder laden können.
Die GUI mache ich nicht mit guide.

Ich übergebe doch Struct S mit den Callbacks... oder ??

'callback',{@load_kofig_data_callback,S});


Gruß Luigi
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: 22.04.2015, 08:55     Titel:
  Antworten mit Zitat      
Hallo mat123lab2,

Es geschieht folgendes im Code:
Code:
S.feld1 = uicontrol();
uicontrol('Style', 'PushButton', 'String', 'Save', 'Callback', {Fcn, S});
S.feld2 = uicontrol();

Jetzt bekommt der Callback die Version von S, die während der Definition aktuell war, also ohne "feld2"!
Im Callback für das Laden wird S zwar in den Inputs übergeben, aber danach nicht ausgelesen. Die Zeile "%S = varargin{3};" is auskommentiert.

Ich empfehele dringend, VARARGIN immer nur dann anzuwenden, wenn die Anzahl der Inputs auch wirklich variabel ist. In allen anderen Fällen wird der Code dadurch unnötig schlechter zu verstehen. Die explizite Angabe der Inputs ist immer klarer. Wenn man bedenkt, dass mit wachsenden Programmen der Zeit für das Debuggen exponentiell steigt, sollte man deshalb auf die Übersichtlichkeit größten Wert legen.

LOAD und SAVE ohne die Variablen zu spezifizieren ist ein großer Nachteil für die Stabilität des Codes. Man kann beim Betrachten des Programms nie wissen, welche Variablen im File stehen und den Ablauf des Programms beeinflussen können:
Code:
% Schlecht:
a = 1;
load('File.mat')
disp(a);  % Hier kann nun alles mögliche angezeigt werden!

% Gut:
a = 1;
FileData = load('File.mat');
disp(a)
disp(FileData.a);

Im unteren Fall ist sofort klar, was der Programmierer gemeint hat.

Wenn Du per SAVE(FileName) den gesamten Workspace abspeicherst, also alle zur Zeit bekannten Variablen, wird auch S mit in das File geschrieben. Beim nachfolgenden LOAD wird die aktuelle Variable S mit der alten überschrieben, und dann sind -wie in der Fehlermeldung zu sehen- die Handles wie S.edit1 ungültig, weil sie sich auf eine andere Figure beziehen.

Wie gesagt: Der Debugger enthüllt diese Vorgänge schnell und sicher. Und per GUIDATA bekommt man immer die aktuelle Version des Structs:

Code:
S.FigureHandle = figure;
S.feld1 = uicontrol();
uicontrol('Style', 'PushButton', 'String', 'Save', 'Callback', Fcn);
S.feld2 = uicontrol();
...
guidata(S.FigureHandle, S);  % Speichere aktuelle Version MIT feld2

function Fcn(objectH, EventData)
S = guidata(objectH);  % Aktuelle Version von S
 

Dein Code wird viel kompakter, wenn Du statt "S.edit1" ein Array verwendest: "S.edit(1)". Dann kannst Du die Werte einfacher per FOR-Schleife auslesen. Und GET nimmt sogar ein ganzes Feld von Handles als Input und liest die Values sogar ohne eine Schleife ein.

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.