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

Wann eine Variable der handle Struktur zuweisen

 

Sebx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2017, 09:04     Titel: Wann eine Variable der handle Struktur zuweisen
  Antworten mit Zitat      
Moin moin,

habe mal eine Frage bezüglich der Handles Struktur.
Wenn ich z.B. x=5 von einer callback function an eine andere übergeben möchte, habe ich das z.B. so gemacht:


Code:
function pushbutton1_Callback(hObject, eventdata, handles)
x=5;
handles.x=x;
guidata(hObject, handles);

%%%
%%%

function pushbutton2_Callback(hObject, eventdata, handles)
x=handles.x;
x*2;
guidata(hObject, handles);


Theoretisch könnte ich doch aber auch nur mit handles arbeiten, d.h.:

Code:
function pushbutton1_Callback(hObject, eventdata, handles)
handles.x=5;
guidata(hObject, handles);

%%%
%%%

function pushbutton2_Callback(hObject, eventdata, handles)
handles.x*2;
guidata(hObject, handles);



Gibt es dabei Vor- bzw. Nachteile, abgesehen davon den Code schlanker zu halten, oder ist das reine Geschmackssache?


Harald
Forum-Meister

Forum-Meister


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

In beiden Fällen ist zu beachten, dass mit dem Ergebnis von x*2 in beiden Fällen nichts weiter gemacht wird.
Durch den guidata-Befehl am Ende gibt es einen entscheidenden Unterschied: wenn du in deinem Code
x = ...
stehen hättest, würde das außerhalb des Callbacks keinen Effekt haben. Wenn du dagegen
handles.x = ...
schreibst, dann steht das veränderte x durch den guidata-Befehl auch in anderen Callbacks zur Verfügung.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2017, 11:34     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort aber diesen Teil hatte ich schon verstandeb. Das Beispiel war jetzt nicht so gut gewählt. Mir ging es darum, ob ich handles.x, nachdem es in die handles Struktur übergeben wurde, im interessierenden Callback erst wieder einer Variablen zuordnen sollte oder direkt mit x.handles arbeiten sollte.

Variante 1: x=handles.x und dann x*2

oder gleich

Variante 2: handles.x*2

Wenn x häufiger im Callback verwendet werden würde, bräuchte man mit der ersten Variante das "handles." nicht immer wieder schreiben und braucht weniger Zeichen.

Beides würde wohl zum gleichen Ergebnis führen aber ich wollte jetzt wissen, ob noch irgendetwas im Hintergrund.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.09.2017, 16:55     Titel:
  Antworten mit Zitat      
Hallo Sebx,

Das kommt darauf an, was Du genau möchtest. Falls die Laufzeit eine rolle spielt, kann dies ein Unterschied machen:
Code:
handels.y = 0;
for k = 1:1e9
  handles.y = handles.y + handles.x;
end

% Oder
y = 0;
x = handles.x;
for k = 1:1e9
  y = y + x;
end
handles.y = y;

Im ersten Fall wird pro Iteration 3 mal ein Struct referenziert. Vermutlich wird Matlab JIT Accelerator vielleicht 2 Referenzierungen daraus machen, aber das ist nicht sicher. Das Referenzieren von Structs benötigt jedenfalls Rechenzeit. Deshalb ist die zweite Methode schneller. Wenn Du "schneller" messen willst, lohnt sich das nur mit dem realen Code, nicht mit diesem trivialen Beispiel.

Neben der Laufzeit spielt aber auch die Zeit zum Programmieren und Debuggen eine Rolle. Ich finde "y = y + x" viel besser lesbar und würde es darum auf jeden Fall bevorzugen. Darüber hinaus würde ich es aber in produktivem Code grundsätzlich anders schreiben: Es hat viele Vorteile den Code für die Berechnungen vom GUI zu trennen. Also:
Code:
function pushbutton2_Callback(hObject, eventdata, handles)
handles.y = myCalculations(handles.x)
guidata(hObject, handles);
end

function y = myCalculations(x)
y = 2 * x;
end

Das hat den Vorteil, dass man das GUI einfach modifizieren kann, oder bei Bedarf die Berechnungen aus einer anderen Funktion aufrufen kann. Wenn man z.B. die Funktion automatisch testen will oder als Batch-Mode mit tausenden unterschiedlichen Inputs aufrufen will, ist es extrem unpraktisch, dass über das GUI zu tun.

Regel: Trenne Daten, Berechnungen und GUI so klar und deutlich, wie möglich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2017, 17:27     Titel:
  Antworten mit Zitat      
Vielen Dank für die Erklärung. Ich werde Deinen Rat befolgen.
 
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.