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

Fehlermedlung in der gui_mainfcn

 

bmtil
Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2016, 11:06     Titel: Fehlermedlung in der gui_mainfcn
  Antworten mit Zitat      
Guten Tag,
ich habe mich die letzten Tage mit GUIDE beschaeftigt und ein paar Testguis zum Üben erstellt. Nebenbei habe ich auch an meinem eigenen Simulink Projekt gearbeitet und die Simulink GUI für meine Zwecke erweitert, siehe save_model.fig .

Ich habe die einzelnen GUI Elemente (listbox1, listbox2, etc.) über den GUIDE hinzugefügt und mir von Matlab die save_model.m erstellen lassen. Anschließend habe ich die entsprechenden Callbacks eingefügt. Leider beim Starten meiner GUI in Simulink, gibt mir Matlab folgende Fehlermedlung:
Zitat:

Conversion to cell from char is not possible.

Error in save_model>listbox2_CreateFcn (line 247)
list(a) = strrep(list{a}, '-',' ');

Error in gui_mainfcn (line 96)
feval(varargin{:});

Error in save_model (line 44)
gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)save_model('listbox2_CreateFcn',hObject,eventdata,guidata(hObject))


Error using struct2handle
Error while evaluating uicontrol CreateFcn

Dabei verstehe ich nicht, wie es in der gui_mainfcn und in save_model (Zeile 44) zu einem Fehler kommen kann, da die Dateie gui_mainfcn Matlab intern ist und der Fehler in save_model bereits im von Matlab selber erzeugtem Code vorkommt. Den Fehler in der Zeile 247, kann ich ebenso nicht finden. Offensichtlich benutze ich struct2handle falsch, jedoch weiss ich nicht, was ich anders machen soll.

Die GUI ansich wid gestartet, ist alledings verbuggt. Wenn ich zum Beispiel über die Checkbox "enable" die Option "constant propagation" auschalte, dann auf die Option "reduce variables" geh um diese auszuschalten, dann wird bei der Option "constant propagation" der Hacken der Checkbox "enable" gesetzt. Ich bin ziemlich verwirrt durch diesen Umstand.

Die linke Seite der GUI scheint perfekt zu funktionieren, nur die rechte eben nicht. Die Idee der linken Seite, ist aus der Liste sich die Optionen einzeln auswaehlen zu können. Vllt. wäre es eleganter statt einer Liste für die Optionen Radiobuttons zu verwenden?

Viele Grüße und Dank, bmtil.

EDIT: aktualisierte Version der save_model.m hochgeladen.

save_model.m
 Beschreibung:

Download
 Dateiname:  save_model.m
 Dateigröße:  11.17 KB
 Heruntergeladen:  512 mal
save_model.fig
 Beschreibung:

Download
 Dateiname:  save_model.fig
 Dateigröße:  4.78 KB
 Heruntergeladen:  541 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.10.2016, 12:06     Titel:
  Antworten mit Zitat      
Hallo,

die genannten Funktionen rufen die von dir selbst veränderte listbox2_CreateFcn auf.
Woran der Fehler liegt, hängt an OPTIMISATIONS.keys.

Vielleicht mal einen Haltepunkt in die Zeile setzen und das dort genauer untersuchen?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2016, 13:40     Titel:
  Antworten mit Zitat      
Hallo, entschuldigung, dass ich so spät antworte, habe lange gebraucht um das zu unteruschen und bin leider zu keinem Ergebniss gekommen.

Also, habe ich angefangen die GUI vom neuen aufzubauen, diesmal auch übersichtiger, siehe die angehangene .fig Datei.
Die linke Seite der GUI funktioniert einwandfrei, also die Auswahl der Algorithmen und der Button "save model". Das einzige was bis jetzt nicht klappt ist die Funktion des Buttons "save options". In der matlab Commando Zeile werden mir zwar die richtigen gesetzen Optionen angezeigt (wenn man auf den Button "save Options" drückt), jedoch werden die damit verbundenen Optimierungen (siehe angehangener .m file ab Zeile 288) nicht ausgeführt. Vermutlich habe ich die Zuweisung meiner Optimierungsfunktionen nicht korrekt angegeben. Jedoch, da Matlab mir keinen Fehler rausgibt, steh ich buchstäblich im Dunkeln und weiss nicht, was ich verändern sollte.
Viele Grüße.


EDIT: Ich habe verstanden, wo das Problem mit der Übergabe der externen Funktionen liegt. Unter der Callback Funktion meines "save options" Buttons (tag = pushbutton4) muss ich die Handles für die jeweilige externe Funktion anders an die GUI übergeben. Und die Handles müssen aufjedenfall auch in der externen Funktion vorhanden sein.

In meinem jetzigem Beispiel sieht es so aus, zunächst der relevante Code Abschnitt meiner GUI:

Code:
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global OPTIMISATIONS;
global debug;
global verbose;


if (get(handles.cbConst,'Value') == get(hObject, 'Max'))
    value_const = 1
    constant_propagation = get(handles.cbConst, 'Value');
    handles = guidata;
else
    value_const = 0;
end


Nun Auschnitt meiner externen Funktion constant_propagation:
Code:
function constant_propagation(graph)
% replace blocks which inputs are constants, create new variables which
% holds the value and propagate this infos
% graph: contains all required nodes which represents the model
constants = filter_graph(graph, 'Constant');
constants_pool = containers.Map();
% save found variables and number of their references
for constant = constants
    if strcmp(graph(constant{1}).third, '')
        name = strsplit(constant{1}, '/');
        constants_pool(constant{1}) = count_references(graph, name{end}, ...
            graph(constant{1}).next);
    end
end


Für einen erfolgreichen Funktionsaufruf müsste die erste Zeile meiner externen Funktion modifiziert werden zu:
Code:
function constant_propagation(handles.graph)


Und anschließend müsste in der GUI unter der Callback für push.button4 irgendwie sowas stehen:
Code:
if (get(handles.cbConst,'Value') == get(hObject, 'Max'))
    value_const = 1
    constant_propagation(handles.graph) = get(handles.cbConst, 'Value');
    handles = guidata;
else
    value_const = 0;
end


Ich bin jetzt deutlich verwirrter als vorher, da ich mir nicht zu 100% sicher bin, ob die Sache mit Handles tatsächlich die Fehlerquelle ist. Ich habe die entsprechend die Funktionen modifiziert, allerdings funktioniert durch die Änderung die komplette GUI nicht mehr. Vermutlich habe ich die Änderungen nicht konsequent durchgezogen, ich wäre schon glücklich wenn ich in meiner GUI save_model.m einfach nur erfolgreich die constant_propagation.m aufrufen könnte Very Happy.

Die Idee mit der Handles Übergabe habe ich von hier:
https://de.mathworks.com/matlabcent.....rnal-functions-with-a-gui und habe versucht die Lösung anzuwenden, jedoch bis jetzt erfolglos.

[EDITED, Jan, Bitte kein Top-Quoting - Danke]

save_model.m
 Beschreibung:

Download
 Dateiname:  save_model.m
 Dateigröße:  11.77 KB
 Heruntergeladen:  480 mal
save_model.fig
 Beschreibung:

Download
 Dateiname:  save_model.fig
 Dateigröße:  5.61 KB
 Heruntergeladen:  453 mal
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: 24.11.2016, 22:20     Titel:
  Antworten mit Zitat      
Hallo bmtil,

Zitat:
Jedoch, da Matlab mir keinen Fehler rausgibt, steh ich buchstäblich im Dunkeln und weiss nicht, was ich verändern sollte.

Es wundert mich sehr, dass Matlab da keine Fehlermeldungen heraus gibt. Es müsste auch einige Warnungen im Editor geben.

Zitat:
Code:
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global OPTIMISATIONS;
global debug;
global verbose;


if (get(handles.cbConst,'Value') == get(hObject, 'Max'))
    value_const = 1
    constant_propagation = get(handles.cbConst, 'Value');
    handles = guidata;
else
    value_const = 0;
end

Die globalen Variablen werden hier ja gar nicht benötigt. Wozu deklarierst Du sie dann?
Die Variable "value_const" wird hier zwar erzegut, aber nirgends verwendet. In anderen Funktionen ist sie nicht sichtbar.
"handles = guidata;" sollte eine Fehlermeldung erzeugen, da guidata Inputs benötigt.

Zitat:
Für einen erfolgreichen Funktionsaufruf müsste die erste Zeile meiner externen Funktion modifiziert werden zu:
Code:
function constant_propagation(handles.graph)

Nein, das wäre nicht erfolgreich, sondern ein Syntax-Fehler. "handles.graph" kann man nicht als Input-Variable verwenden. In der Definition einer Funktion dürfen nur Variablen stehen. Ein Struct mit Feldnamen ergibt hier keinen Sinn.

Zitat:
Ich bin jetzt deutlich verwirrter als vorher, da ich mir nicht zu 100% sicher bin, ob die Sache mit Handles tatsächlich die Fehlerquelle ist.

Welche Sache mit welchen Handles ist die Quelle für welchen Fehler?
Ich kann Dir nicht mehr folgen.

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 - 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.