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);
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.
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.
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);
%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
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.
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.
Einstellungen und Berechtigungen
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
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.