2017-11-02 2 views
1

Grundsätzlich das gleiche wie oben.Was ist der Unterschied zwischen guidata (hObject, handles) und handles = guidata (hObject)?

In meiner MATLAB-GUI habe ich eine Drucktaste, die Daten aus Textfeldern abruft und sie in einem Array-Handle (genauer gesagt mehreren Wegpunkten) speichert. Ich verwende diese Matrix zu einem späteren Zeitpunkt, also brauche ich die Daten in einem Handle gespeichert.

In der Callback-Funktion rufe ich eine andere Funktion, die dies tut (um meine Hauptdatei schön und ordentlich zu halten). Hier, nach dem Speichern aller Daten im entsprechenden Handle, rufe ich guidata(hObject, handles) an, um meine Änderungen zu speichern.

Allerdings, außerhalb der Funktion, im Rückruf, wenn ich display(handle.data) anrufen, zeigt es mir den Griff, bevor ich den Rückruf rief, obwohl ich es aktualisiert. Jetzt einen anderen guidata(hObject, handles) direkt im Callback anrufen ändert nichts, aber wenn ich handles = guidata(hObject) rufe funktioniert es.

Meine Frage: WARUM? Ist es nur MATLAB?

Code:

func_addWaypoint(hObject, handles) 
display(handles.cart_coords) 
handles = guidata(hObject); 
display(handles.free_coords) 

Hinweis: die erste display() gibt mir die alten Daten, die zweite gibt mir neuen Daten. Hier ist meine Funktion:

function func_addWaypoint(hObject,handles) 

new_waypoint = nan(3,2); 

coord_constraint = ones(3,2); 


new_waypoint(1,1) = str2double(handles.edit_start_x1.String); 
new_waypoint(2,1) = str2double(handles.edit_start_x2.String); 
new_waypoint(3,1) = str2double(handles.edit_start_x3.String); 

new_waypoint(1,2) = str2double(handles.edit_stop_x1.String); 
new_waypoint(2,2) = str2double(handles.edit_stop_x2.String); 
new_waypoint(3,2) = str2double(handles.edit_stop_x3.String); 
v     
for i = 1:numel(new_waypoint) 
    if isnan(new_waypoint(i)) 
     new_waypoint(i) = rand() * 2 - 1; 
     coord_constraint(i) = 0; 
    end 
end 

handles.cart_coords = [handles.cart_coords, new_waypoint]; 
handles.free_coords = [handles.free_coords, coord_constraint]; 

guidata(hObject, handles); 

Antwort

0

Documentation for guidata

guidata (object_handle, Daten) speichert die variablen Daten mit dem Objekt durch object_handle angegeben.

vs

data = guidata (object_handle) gibt Daten zuvor gespeichert werden, oder eine leere Matrix wenn nichts gespeichert ist.

Grundsätzlich, wenn Sie etwas in der handles Struktur ändern dann stellen Sie sicher, dass Sie guidata(hObject,handles) aufrufen, bevor die Funktion verlassen.

Wenn Sie sich auf benutzerdefinierte Informationen in Handles verlassen, die an anderer Stelle geändert wurden, rufen Sie oben in der Funktion handles = guidata(jObject) an.

Sonst werden Sie Probleme, wie Sie sehen, wo Sie eine alte Kopie der handles Struktur haben könnte

0

Es gibt eigentlich zwei Kopien Ihrer Variable handles: eine besteht in der workspaceaußerhalb der Funktion func_addWaypoint, und ein solches vorhanden ist innerhalb der Arbeitsbereich von func_addWaypoint. Wenn Sie die Funktion aufrufen, werden die Daten der Variablen außerhalb der Funktion in die Variable innerhalb der Funktion (caveat) kopiert.

Sie machen Änderungen an der handles Variable innerhalb die Funktion und fügen Sie dann die geänderte Version hObjectguidata(hObject, handles); verwenden. Die ursprüngliche handles-Variable, die in dem Arbeitsbereich außerhalb der der Funktion vorhanden ist, hat jedoch die unveränderten Daten. Diese Variable wird mit den neuen Werten überschrieben, die an hObject angehängt sind, wenn Sie sie mit handles = guidata(hObject); abrufen.

Verwandte Themen