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

Funktionsparameter an Funktion übergeben

 

Lokdog
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 04.05.2016, 07:34     Titel: Funktionsparameter an Funktion übergeben
  Antworten mit Zitat      
Hallo zusammen,

ich habe folgende 2 Funktionen.

Mein Gui, das folgende Variablen ausspuckt:
Code:
% --- Executes on button press in pushbutton1.
function  pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles=guidata(hObject);

Var01= str2double(get(handles.Var11, 'string'));
assignin ('base','Var01',Var01')

Var02= str2double(get(handles.Var22, 'string'));
assignin ('base','Var02',Var02')

Var03= str2double(get(handles.Var33, 'string'));
assignin ('base','Var03',Var03')

Var04= str2double(get(handles.Var44, 'string'));
assignin ('base','Var04',Var04')

Var05= str2double(get(handles.Var55, 'string'));
assignin ('base','Var05',Var05')

Var06= str2double(get(handles.Var66, 'string'));
assignin ('base','Var06',Var06')
 
Var07= str2double(get(handles.Var77, 'string'));
assignin ('base','Var07',Var07')

Var08= str2double(get(handles.Var88, 'string'));
assignin ('base','Var08',Var08')

Var09= str2double(get(handles.Var99, 'string'));
assignin ('base','Var09',Var09')

Var10= str2double(get(handles.Var1010, 'string'));
assignin ('base','Var10',Var10')

Name= get(handles.Name, 'string');
assignin ('base','Name',Name)

VAHA = get(handles.BCVAHA, 'SelectedObject');
VAHAW = get(VAHA, 'String');
NCNO = get(handles.BCNCNO, 'SelectedObject');
NCNOW = get(NCNO, 'String');

    if strcmp(NCNOW, 'NC') == 1
    NCONO = 1;
    else
    NCONO = 2;
    end
    assignin ('base','NCONO',NCONO')
    if strcmp(VAHAW, 'VA') == 1
    VAOHA = 'VA';
    VAOHA = VAOHA';
    else
    VAOHA = 'HA';
    VAOHA = VAOHA';
    end
    assignin ('base','VAOHA',VAOHA')
guidata(hObject, handles);
close(gcbf);


Und meine Interpolation Funktion, die Variable "Erweitert" und das diese Funktion auch etwas ausgeben soll, einfach mal ignorieren.

Code:
function[] =  interpol(Erweitert,Var01,Var02,Var03,Var04,Var05,Var06,Var07,Var08,Var09,Var10)
ReglerWert = [0 Var01 Var02 Var03 Var04 Var05 Var06 Var07 Var08 Var09 Var10];




    for i=2:1:Spa
    if (Erweitert(8,i) > 0) && (Erweitert(8,i) > 1500) && (Erweitert(8,i) > 3000)
        Regler_0Ap=interp1(Erweitert(:,1),Erweitert(:,i),ReglerWert,'linear','extrap');
        %plot (ReglerWert,Regler_0Ap); hold on; grid on;
       

    elseif (Erweitert(8,i) > 0) && (Erweitert(8,i) < 1500)
        Regler_15Ap=interp1(Erweitert(:,1),Erweitert(:,i),ReglerWert,'linear','extrap');
        %plot (ReglerWert, Regler_15Ap);hold on;
       
    elseif (Erweitert(8,i) < 0) && (Erweitert(8,i) < -1500)
        Regler_0An=interp1(Erweitert(:,1),Erweitert(:,i),ReglerWert,'linear','extrap');
        Regler_0An=Regler_0An*-1;
        %plot (ReglerWert,Regler_0An);hold on;
           
    elseif (Erweitert(8,i) < 0) && (Erweitert(8,i) < -900) && (Erweitert(8,i) > -1350)
        Regler_15An=interp1(Erweitert(:,1),Erweitert(:,i),ReglerWert,'linear','extrap');
        Regler_15An=Regler_15An*-1;
        %plot (ReglerWert,Regler_15An); hold on;
       
    end
    end
end


Mein Problem ist nun, das die Variablen (Var01,Var02,...) von meinem GUI nicht an meine Interpol Funktion übergeben werden.
Ich rufe diese beiden Funktionen über eine dritte Funktion auf.

Vielen Dank für eure Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2016, 08:23     Titel:
  Antworten mit Zitat      
Hallo,

und wie rufst du die Funktionen auf?
Du musst die Eingabeargumente selbst beim Aufruf übergeben.

Anstatt den Base Workspace zuzumüllen, würde ich die Varxx innerhalb der GUI ablegen (http://www.mathworks.com/help/matla.....data-among-callbacks.html) und/oder die Variablen zu einer Struktur zusammenfassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 04.05.2016, 08:26     Titel:
  Antworten mit Zitat      
Es ist nicht ersichtlich, wie du die Funktion Interpol aufrufst - denn nur dann kann man sagen, ob du alle Variablen in den Funktionsaufruf eingefügt hast, oder nicht.


Grundsätzlich aber ist es nicht sehr übersichtlich, so eine lange variablenliste mit durchnummerierten Variablen zu haben. Hier rate ich dir je nach Datentyp zu einem Vektor [var01 ... var10], CellArray {...}, oder in einem Struct.

Ein Struct hat den Vorteil, dass du auch die Variable "Erweitert" mit unterbringen kannst und für den Funktionsaufruf nur noch:
Code:
outputVar = Interpol(inputStruct);

nutzen musst.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Lokdog
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 04.05.2016, 08:36     Titel:
  Antworten mit Zitat      
Ja, den Workspace will ich auch gar nicht vollmüllen, ich habe diese Werte nur mit "assignin" in Workspace übertragen, da ich dachte es läge daran.

Ich rufe die Funktion mit folgender Funktion auf:

Code:
function Werteeinlesen(Erweitert,Var01,Var02,Var03,Var04,Var05,Var06,Var07,Var08,Var09,Var10)
callexcel;
waitfor(Regler);
interpol(Erweitert,Var01,Var02,Var03,Var04,Var05,Var06,Var07,Var08,Var09,Var10);
end
 


Regler ist die Funktion des GUI
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 04.05.2016, 08:53     Titel:
  Antworten mit Zitat      
1. schau, dass du die Variablen zusammenfaßt und sinnigerweise gleich an die normalen handles anhängst - diese werden am Ende der Funktion sowieso zurückgespeichert.
In den Funktionen holst du dir dann nur die jeweils aktuellen handles und kannst mit den Daten arbeiten.


Code:
function  pushbutton1_Callback(hObject, eventdata, handles)
handles=guidata(hObject); % <-- hier werden die handles geladen!
%...
handles.VarStr{1,1} = str2double(get(handles.Var11, 'string'));
handles.VarStr{end+1,1} = str2double(get(handles.Var22, 'string'));
% ...

handles.Name= get(handles.Name, 'string');

%...
guidata(hObject, handles); % <-- hier werden die handles zurückgeschrieben!
close(gcbf);


function interpol(hObject, eventdata, handles)
handles=guidata(hObject); % <-- hier werden die handles geladen!
%...

guidata(hObject, handles); % <-- hier werden die handles zurückgeschrieben!


function Werteeinlesen(hObject, eventdata, handles)
handles=guidata(hObject); % <-- hier werden die handles geladen!
%...

guidata(hObject, handles); % <-- hier werden die handles zurückgeschrieben!


2. Es ´fehlt weiterhin die wichtigste Info, nur eine Funktion weiter: wie rufst du "Werteeinlesen" auf?
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))

Zuletzt bearbeitet von Mmmartina am 04.05.2016, 08:55, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2016, 08:54     Titel:
  Antworten mit Zitat      
Hallo,

... und wie rufst du Werteeinlesen auf?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 04.05.2016, 09:15     Titel:
  Antworten mit Zitat      
Werteeinlesen würde ich einfach starten übers command Fenster, bzw. über den Run Button.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Werteeinlesen würde ich einfach starten übers command Fenster, bzw. über den Run Button.

... und vor allem letzteres kann nicht funktionieren, da die Funktion Eingabeargumente erwartet.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 09.05.2016, 08:17     Titel:
  Antworten mit Zitat      
Hallo Mmmartina,

deine Lösung scheint mir plausibel zu sein, ich bin gerade dabei es auszuprobieren.
Da ich das mit dem {1,1} nicht direkt verstanden habe, habe ich meine neue Variablen nacheinander in die handles geschrieben:
Code:
function  pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles=guidata(hObject);


handles.Var01 = str2double(get(handles.Var11, 'string'));
handles.Var02 = str2double(get(handles.Var11, 'string'));
handles.Var03 = str2double(get(handles.Var11, 'string'));
handles.Var04 = str2double(get(handles.Var11, 'string'));
handles.Var05 = str2double(get(handles.Var11, 'string'));
handles.Var06 = str2double(get(handles.Var11, 'string'));
handles.Var07 = str2double(get(handles.Var11, 'string'));
handles.Var08 = str2double(get(handles.Var11, 'string'));
handles.Var09 = str2double(get(handles.Var11, 'string'));
handles.Var10 = str2double(get(handles.Var11, 'string'));

handles.Name=get(handles.Name, 'string');


VAHA = get(handles.BCVAHA, 'SelectedObject');
VAHAW = get(VAHA, 'String');
NCNO = get(handles.BCNCNO, 'SelectedObject');
NCNOW = get(NCNO, 'String');

    if strcmp(NCNOW, 'NC') == 1
    NCONO = 1;
    else
    NCONO = 2;
    end
    assignin ('base','NCONO',NCONO')
    if strcmp(VAHAW, 'VA') == 1
    VAOHA = 'VA';
    VAOHA = VAOHA';
    else
    VAOHA = 'HA';
    VAOHA = VAOHA';
    end
    assignin ('base','VAOHA',VAOHA')
guidata(hObject, handles);
close(gcbf);


 


Nun habe ich auch meine Interpol so geändert wie du es gesagt hattest:

Code:

function interpol(hObject, eventdata, handles)
handles = guidata(hObject);
ReglerWert = [0 handles.Var01 handles.Var02 handles.Var03 handles.Var04 handles.Var05 handles.Var06 handles.Var07 handles.Var08 handles.Var09 handles.Var10];

 


Wenn ich dies nun einmal zum Testen nacheinander ausführe, kommt jedoch:

Code:

>> Regler
>> interpol
Error using interpol (line 2)
Not enough input arguments.
 
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: 09.05.2016, 15:02     Titel:
  Antworten mit Zitat      
Hallo Lokdog,

Die durchnummerierten Variablen sind offensichtlich sehr häßlich. Das ist so unübersichtlich, dass ein Debuggen sehr erschwert wird.
Zudem sind die Inhalöte der Variablen "Var01" bis "Var10" alle identisch?!

Verwende lieber aussagekräftige Fieldnames wie "handles.Force = ...", "handles.Time = ...", oder ein Array:
Code:
handles.Var = {str2double(get(handles.Var01, 'string')), ...
                                str2double(get(handles.Var11, 'string'))};  % usw.
 


Die Werte im Struct "handles" abzuspeichern, diesen Struct dann im Figrue-Objekt zu speichern und direkt danach das Figure Objekt zu löschen, ist sinnfrei:
Zitat:
Code:
guidata(hObject, handles);
close(gcbf);


Du müsstest interpol also innerhalb des Callbacks aufrufen, bevor Du alle Daten löschst.
Bisher rufst Du interpol ja immer noch ohne Input-Argumente auf und genau das sagt die Fehlermeldung ja auch bereits.

Funktionen benötigen Inputs. Was Du versuchst ist vergleich mit dem Aufruf der sin Funktion ohne ein Argument mit zu liefern. Das kann nicht funktionieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Lokdog
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 10.05.2016, 11:36     Titel:
  Antworten mit Zitat      
Hallo Leuts,

also habe es nun geschafft alle Variablen meinen Funktionen zu übergeben und erfolgreich damit zu arbeiten.

Das Gesamte Programm sieht nun wie folgt aus.

Ich habe eine Funktion "Interpolation" diese ruft die Funktion "Regler" auf.
in Regler werden meine Variablen definiert und die Funktion "Interpol" aufgerufen.
In "Interpol" wird interpoliert und meine Funktion "Datenschreiben" aufgerufen.
Nach Datenschreiben ist schluss.
Nun möchte ich, dass das ganze zwei mal gemacht wird.

Habe es mit:

Code:
function interpolation
for i=1:1:2
Regler;
end
end


oder mit:

Code:
function interpolation
Regler;
Regler;

end


Versucht, in beiden Fällen wird Regler nur 1 mal durchlaufen.
Wie würde es funktionieren?

Gruß und Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 10.05.2016, 12:27     Titel:
  Antworten mit Zitat      
Gegenfrage: woran siehst du, dass 'Regler' nur einmal durchlaufen wird?

Setze dir mal einen Breakpoint zu begin innerhalb der Regler-Funktion und starte mal deine Funktion Interpolation.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Lokdog
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 10.05.2016, 12:51     Titel:
  Antworten mit Zitat      
Also grob gesagt, weiß ich das es "Regler" nur einmal durchläuft, da das GUI sich nur einmal öffnet.
Mit dem Breakpoints läuft das ganze halt einmal durch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

von GUIs kann standardmäßig nur eine Instanz geöffnet werden.

Abhilfe: in den Optionen die Singleton-Option abwählen.
http://www.mathworks.com/help/matla.....ing_guis/gui-options.html
Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Lokdog
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 10.05.2016, 13:16     Titel:
  Antworten mit Zitat      
funktioniert !
Du bist einfach ein Killer Harald Smile
Danke euch allen, nun läuft es, wie ich es mir Vorgestellt habe.
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 - 2025 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.