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

Grundlagen guidata/handles und Funktionen

 

effa7
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 01.08.08
Wohnort: ---
Version: R2007b, R2008a
     Beitrag Verfasst am: 01.08.2008, 12:09     Titel: Grundlagen guidata/handles und Funktionen
  Antworten mit Zitat      
Hallo,

auch nach längerem Lesen im Forum und der Hilfe habe ich guidata und die handles struktur noch nicht so wirklich verstanden.

Teil1: Unterscheidung zwischen handles-Struktur und Object-handle:

Beispiel:
Code:
%In der Inititialisierung der GUI (GUIDE) wird ein neues Feld der handles-Struktur hinzugefügt%

handles.testfeld=33;
guidata(hObject, handles);


Wenn ich es richtig verstehe is hObject immer das handle zum aktuellen Objekt - also hier die main_figure; handles ist die Struktur die die selbstdefinierten Felder, aber auch die handles zu allen anderen Objekten enthält

nun folgendes:
Code:
% Im Callback eines pushbuttons verändere ich den Wert und speichere ihn mit guidata%
handles.testfeld=22;
guidata(hObject, handles);


Jetzt ist der Wert von hObject doch verschieden zu dem beim erstellen des Feldes (!?). Ist die Verwendung so richtig oder liegt da ein Fehler vor?
Wäre guidata(gcbo, handles) hier das gleiche wie guidata(hObject, handles)?
_________________________________
Teil2: Manipulieren der handles-Felder in Funktionen

Nun möchte ich die handles-Felder, die ich erstellt habe in verschiedenen Funktionen bearbeiten.

Nach dem Lesen hier gibt es verschieden Varianten dazu, ich verstehe nur nicht was gut ist und was schlecht. Mal ein Beispiel:

Grundsätzlich: Ich rufe in einem Callback eine Funktion 'Daten_bearbeiten' auf, die wiederum Unterfunktionen (Subfunkt_A, Subfunkt_B) aufruft. Jede Funktion verändert z.B. das oben erstellte Feld handles.testfeld


Variante 1:
Code:
%Button Callback
function pushbutton_Callback(hObject, eventdata, handles)
  Daten_bearbeiten(hObject,handles);
  %Fehlt hier noch eine Aktualisierung der handles?
  %handles=guidata(hObject);
  %Probeausgabe
 Ausgabe=handles.testfeld

%Funktion Daten_bearbeiten
function Daten_bearbeiten(hObject,handles)
 handles.testfeld=7;
 Subfunkt_A(hObject,handles);
 Subfunkt_B(hObject,handles);
 guidata(hObject, handles);

%Unterfunktion Subfunkt_A
function Subfunkt_A(hObject, handles)
  handles.testfeld=handles.testfeld*2;
  guidata(hObject, handles);
 


Die Frage für mich ist, ob hier alle Funktionen wirklich auf die gleichen handles zugreifen, oder evtl. eine veraltete Struktur verwendet wird.

Variante 2:
Code:
%Button Callback
function pushbutton_Callback(hObject, eventdata, handles)
  Daten_bearbeiten(handles.main_figure);
  %Fehlt hier noch eine Aktualisierung der handles?
  %handles=guidata(handles.main_figure); ?
  %Probeausgabe
 Ausgabe=handles.testfeld

%Funktion Daten_bearbeiten
function Daten_bearbeiten(main_handle)
 handles=guidata(main_handle);
 handles.testfeld=7;
 Subfunkt_A(main_handle);
 Subfunkt_B(main_handle);
 guidata(main_handle, handles);

%Unterfunktion Subfunkt_A
function Subfunkt_A(main_handle)
  handles=guidata(main_handle);  
  handles.testfeld=handles.testfeld*2;
  guidata(main_handle, handles);


Ich lade mir hier also jedes mal die handles in jeder Funktion von der main_figure

Variante 3:
Code:
%Button Callback
function pushbutton_Callback(hObject, eventdata, handles)
  handles=Daten_bearbeiten(handles);

  %Probeausgabe
 Ausgabe=handles.testfeld
 guidata(hObject, handles);

%Funktion Daten_bearbeiten
function returnhandle=Daten_bearbeiten(handles)
 handles.testfeld=7;
 handles=Subfunkt_A(handles);
 handles=Subfunkt_B(handles);
 returnhandle=handles;

%Unterfunktion Subfunkt_A
function return_handleA=Subfunkt_A(handles)
  handles.testfeld=handles.testfeld*2;
  return_handleA=handles;


Hier wird also die handles-Struktur jeweils von der Funktion zurückgeben anstatt sie zu speichern.

____________________

So weit zum Wirrwarr. Wäre super wenn ihr ein paar Tipps für mich hättet was der beste Ansatz ist und wenn ihr alle meine Fehler in obigem Code aufdecken würdet.

Danke
Private Nachricht senden Benutzer-Profile anzeigen


effa7
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 01.08.08
Wohnort: ---
Version: R2007b, R2008a
     Beitrag Verfasst am: 01.08.2008, 13:27     Titel: Nachtrag
  Antworten mit Zitat      
Weiß jemand wie die Speicherverwaltung mit den handles-structs funktioniert? Wird bei jedem Übergeben an eine Funktion eine Kopie erzeugt oder wird der Orginal struct bearbeitet?

Hintergrund ist, dass ich in meiner handles structure mehrere arrays von der Größe 2000x2000 habe, welche an sich schon recht viel Speicher verbrauchen - ein Mehrmaliges Kopieren durch übergabe an Unterfunktionen wäre da natürlich extrem schlecht.
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2008, 13:39     Titel: Re: Grundlagen guidata/handles und Funktionen
  Antworten mit Zitat      
effa7 hat Folgendes geschrieben:
Hallo,

auch nach längerem Lesen im Forum und der Hilfe habe ich guidata und die handles struktur noch nicht so wirklich verstanden.

Teil1: Unterscheidung zwischen handles-Struktur und Object-handle:

Beispiel:
Code:
%In der Inititialisierung der GUI (GUIDE) wird ein neues Feld der handles-Struktur hinzugefügt%

handles.testfeld=33;
guidata(hObject, handles);


Wenn ich es richtig verstehe is hObject immer das handle zum aktuellen Objekt - also hier die main_figure; handles ist die Struktur die die selbstdefinierten Felder, aber auch die handles zu allen anderen Objekten enthält

nun folgendes:
Code:
% Im Callback eines pushbuttons verändere ich den Wert und speichere ihn mit guidata%
handles.testfeld=22;
guidata(hObject, handles);


Jetzt ist der Wert von hObject doch verschieden zu dem beim erstellen des Feldes (!?). Ist die Verwendung so richtig oder liegt da ein Fehler vor?

Ja, nun ist hObject das handle auf den pushbutton. Das ist schon richtig so (der pushbutton kennt ja die handles von anderen Objekten nicht - bis auf dessen "parents"). Allerdings ist es für den Befehl "guidata" unerheblich. Dieser Befehl benötigt das handle auf irgendein Objekt der GUI. Ob das Achsen, pushbuttons, plots oder was anderes ist, ist eigentlich egal.
Zitat:

Wäre guidata(gcbo, handles) hier das gleiche wie guidata(hObject, handles)?
Ja. Allerdings übergeben Callback-Funktionen per default schon immer das Objekt, von dem sie aufgerufen werden, und eine zusätzliche Variable eventdata.

Zitat:

_________________________________
Teil2: Manipulieren der handles-Felder in Funktionen

Nun möchte ich die handles-Felder, die ich erstellt habe in verschiedenen Funktionen bearbeiten.

Nach dem Lesen hier gibt es verschieden Varianten dazu, ich verstehe nur nicht was gut ist und was schlecht. Mal ein Beispiel:

Grundsätzlich: Ich rufe in einem Callback eine Funktion 'Daten_bearbeiten' auf, die wiederum Unterfunktionen (Subfunkt_A, Subfunkt_B) aufruft. Jede Funktion verändert z.B. das oben erstellte Feld handles.testfeld


Variante 1:
Code:
%Button Callback
function pushbutton_Callback(hObject, eventdata, handles)
  Daten_bearbeiten(hObject,handles);
  %Fehlt hier noch eine Aktualisierung der handles?
  %handles=guidata(hObject);
  %Probeausgabe
 Ausgabe=handles.testfeld
[/quote]
Nunja, je nachdem was du verändern willst. Wenn du es mit der Aktualisierung mittels guidata machst, dann benötigst du die Eingabevariable handles nicht, da sie überflüssig wird. Du kannst es eigentlich machen wie du willst. Bei der einen Methode (handles wird direkt übergeben), werden die Werte verwendet, die du übergibst. Inwiefern die nun aktuell sind, hängt vom Eingabewert im Funktionsaufruf ab.
Die andere Variante liest die handles direkt aus der GUI aus (mit guidata).

Was nun besser ist, hängt von der Anwendung ab. Ich bevorzuge die guidata-Variante, da ich keine Unstimmigkeiten mit Variablenübergabe zu befürchten habe.

[quote]
%Funktion Daten_bearbeiten
function Daten_bearbeiten(hObject,handles)
 handles.testfeld=7;
 Subfunkt_A(hObject,handles);
 Subfunkt_B(hObject,handles);
 guidata(hObject, handles);

%Unterfunktion Subfunkt_A
function Subfunkt_A(hObject, handles)
  handles.testfeld=handles.testfeld*2;
  guidata(hObject, handles);
 


Die Frage für mich ist, ob hier alle Funktionen wirklich auf die gleichen handles zugreifen, oder evtl. eine veraltete Struktur verwendet wird.

Da werden die Werte NICHT aktualisiert!!
Das Problem daran ist, dass du handles immer wieder neu auslesen musst, wenn du eine aktuelle Variante benutzt. Da du dies nicht machst, werden die Änderungen in Subfunkt_A nicht berücksichtigt. Da gibt es aber Abhilfe:
-1
Code:
function Subfunkt_A(hObject)
   handles = guidata(hObject);
   handles.testfeld = handles.testfeld*2;
   guidata(hObject,handles);

oder
-2
Code:
function Daten_bearbeiten(hObject,handles)
 handles.testfeld=7;
 Subfunkt_A(hObject,handles);
 handles = guidata(hObject);
 Subfunkt_B(hObject,handles);
 

oder
-3
Code:
function handles = Subfunkt_A(hObject,handles)
 handles.testfeld = handles.testfeld*2;
 

Code:
function Daten_bearbeiten(hObject,handles)
 handles.testfeld=7;
 handles = Subfunkt_A(hObject,handles);
 handles = Subfunkt_B(hObject,handles);
 guidata(hObject,handles);
 


Zitat:

Variante 2:
Code:
%Button Callback
function pushbutton_Callback(hObject, eventdata, handles)
  Daten_bearbeiten(handles.main_figure);
  %Fehlt hier noch eine Aktualisierung der handles?
  %handles=guidata(handles.main_figure); ?
  %Probeausgabe
 Ausgabe=handles.testfeld

%Funktion Daten_bearbeiten
function Daten_bearbeiten(main_handle)
 handles=guidata(main_handle);
 handles.testfeld=7;
 Subfunkt_A(main_handle);
 Subfunkt_B(main_handle);
 guidata(main_handle, handles);

%Unterfunktion Subfunkt_A
function Subfunkt_A(main_handle)
  handles=guidata(main_handle);  
  handles.testfeld=handles.testfeld*2;
  guidata(main_handle, handles);


Ich lade mir hier also jedes mal die handles in jeder Funktion von der main_figure

Ob du die handles aktualisieren musst, hängt von dem Eingabewert von handles ab. Aktualisieren schadet nie, kann aber überflüssig sein, falls die Eingabevariable handles schon aktuell ist. Ich würde anstelle von
Code:
handles=guidata(handles.main_figure);
allerdings
Code:
handles = guidata(hObject);
verwenden. Ansonsten sieht es eigentlich gut aus.
Zitat:

Variante 3:
Code:
%Button Callback
function pushbutton_Callback(hObject, eventdata, handles)
  handles=Daten_bearbeiten(handles);

  %Probeausgabe
 Ausgabe=handles.testfeld
 guidata(hObject, handles);

%Funktion Daten_bearbeiten
function returnhandle=Daten_bearbeiten(handles)
 handles.testfeld=7;
 handles=Subfunkt_A(handles);
 handles=Subfunkt_B(handles);
 returnhandle=handles;

%Unterfunktion Subfunkt_A
function return_handleA=Subfunkt_A(handles)
  handles.testfeld=handles.testfeld*2;
  return_handleA=handles;


Hier wird also die handles-Struktur jeweils von der Funktion zurückgeben anstatt sie zu speichern.

____________________

So weit zum Wirrwarr. Wäre super wenn ihr ein paar Tipps für mich hättet was der beste Ansatz ist und wenn ihr alle meine Fehler in obigem Code aufdecken würdet.

Danke


Ich sehe grad dass Ansatz 2 und 3 mehr oder weniger das beschreiben was ich weiter oben als Ansatz geschrieben habe. Beide müssten eigentlich funktionieren. Wie erwähnt sind sie von der Funktionalität her identisch, die Funktionsweise ist unterschiedlich. Je nach Anwendung ist vielleicht der eine Ansatz besser geeignet als der andere.

Zu Variante 2: Wenn du schon allen Funktionen ausschließlich ein handle übergibst, dann würde ich es doch so belassen
Code:
function pushbutton_Callback(hObject, eventdata)
  handles = guidata(hObject);
  Daten_bearbeiten(hObject);
 Ausgabe=handles.testfeld


Da ich nicht weiss wie MATLAB Strukturen übergibt (Zeiger oder doch die ganzen Werte), kann ich leider keine Aussage über die Speicherbelastung treffen.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
effa7
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 01.08.08
Wohnort: ---
Version: R2007b, R2008a
     Beitrag Verfasst am: 01.08.2008, 13:56     Titel:
  Antworten mit Zitat      
Hej,

danke für die Antwort - fand Variante 2 mittlerweile auch am elegantesten. Wäre cool wenn mir dann noch einer mit der Speicheverwaltung weiterhelfen könnte.
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.