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

Variable aus Skript in Funktion verwenden

 

RaphaelW

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2015, 15:50     Titel: Variable aus Skript in Funktion verwenden
  Antworten mit Zitat      
Hallo zusammen. Ich habe ein Skript geschrieben, um mir verschiedene Verläufe plotten zu lassen.
Zusätzlich habe ich eine Funktion geschrieben, die mir ein Dropdown-Menü
erstellt, um hierüber auswählen zu können, welche Verlauf geplottet werden soll.

Hier der Code für das Dropdown-Menü und ein Fall (Case) des zu plottenden Verlaufs, das ich über switch abfrage :

Code:
function gui()
 
% Figure erstellen
h = figure('ToolBar', 'None', ...
  'MenuBar', 'None', ...
  'Resize', 'off', ...
  'Name', 'Plot Selection', ...
  'NumberTitle', 'off', ...
  'Position', [300 300 210 110]);
 
% Label erstellen
uicontrol(h, 'Style', 'text', ...
  'Position', [10 85 80 15], ...
  'String', 'Jahreszeit', ...
  'HorizontalAlignment', 'Center', 'FontWeight', 'Bold');

uicontrol(h, 'Style', 'text', ...
  'Position', [10 55 80 15], ...
  'String', 'Tag', ...
  'HorizontalAlignment', 'Center', 'FontWeight', 'Bold');
 
% Dropdown-Feld1 erstellen
t = uicontrol(h, 'Style', 'PopupMenu', ...
  'Position', [105 77 100 25], ...
  'String', {'Winter' 'Sommer' 'Uebergang'});
 
% Dropdown-Feld2 erstellen
a = uicontrol(h, 'Style', 'PopupMenu', ...
  'Position', [105 47 100 25], ...
  'String', {'Werktag', 'Samstag', 'Sonntag'});
 
% Button erstellen
uicontrol(h, 'Style', 'PushButton', ...
  'Position', [130 10 75 25], ...
  'String', 'Ok', ...
  'Callback', {@OnOkClick, a, t});

% Quit-Button erstellen
uicontrol(h, 'Style', 'PushButton', ...
  'Position', [20 10 75 25], ...
  'String', 'Quit', ...
  'Callback', {@OnQuitClick});
 
% Figure darstellen
set(h, 'Visible', 'on');


%Click
function [season2, day2] = OnOkClick (obj, e, d, s)
day = get(d, 'String');
day = day{get(d, 'Value')};
day2 = get(d, 'Value');
 
season = get(s, 'String');
season = season{get(s, 'Value')};
season2 = get(s, 'Value');
 
assignin('base', 'day', day);
assignin('base', 'day2', day2);
assignin('base', 'season', season);
assignin('base', 'season2', season2);


%Quit
function OnQuitClick (obj, e)
close(gcbf);


%Darstellung eines Falls
switch season2
   
    case 1
       
        switch day2
           
            case 1
                figure ('name','Winter Werk');
                hold on
                plot_slp = plot(Zeit, Winter_Werktag, 'b', 'LineWidth', 1);
                %h1 = fill(Zeit(index([1 1:end end])),[baseLine Winter_Werktag(index)' baseLine],'b','EdgeColor','none');
                datetick('x')
                plot_wasch = plot(Zeit, Winter_Werktag_ohne, 'g','LineWidth', 1);
                %h2 = fill(Zeit(index([1 1:end end])),[baseLine Winter_Werktag_ohne(index)' baseLine],'g','EdgeColor','none');
                plot_last = plot(Zeit, A_w_Werktag, 'r');
                datetick('x')
                title({'Winter Werktag' AnzH AnzA});
                xlabel('Uhrzeit');
                ylabel('kW');
                legend ([plot_slp, plot_wasch, plot_last], 'Plot 1', 'Plot 2','Plot 3','Location','northwest');
                grid on
                hold off


Dieser Code ist in der Funktion "Menue" gespeichert, die im Skript aufgerufen wird. Also wie folgt:

Code:
% Einlesen der gesamten Wertetabelle aus Exceldatei
Profil = xlsread('Verlaeufe.xls',1,'B4:J99');
%Werte in Vektoren für die Jahreszeiten einteilen.
%Winter
Winter_Samstag = Profil(1:96,1)*Anzahl_Haushalte;
Winter_Sonntag = Profil(1:96,2)*Anzahl_Haushalte;
Winter_Werktag = Profil(1:96,3)*Anzahl_Haushalte;


%Hier folgen noch weitere Werte, die eingelesen werden. Und anschließend wird die Funktion aufgerufen.

Menue;

 


Die Variablen wie Zeit, Winter_Werktag etc. werden direkt im Skript eingelesen. Die Funktion "Menue" kann jedoch nicht auf diese ganzen Variablen zugreifen.
Meine Frage lautet deshalb, wie die Funktion auf diese Variablen zugreifen kann. Oder muss ich die ganzen Variablen als global deklarieren?

Liebe Grüße und vielen Dank schonmal.


Martin91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2015, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

da kann ich Winkow von letzte Tage zitieren

"funktionen haben ihreren eigenen variablen raum. wenn du variablen nicht übergiebst sind sie da auch nicht bekannt. "

http://www.gomatlab.de/loesung-nich.....rfahre-t36555.html#145728

Code:
Menue(Winter_Samstag,Winter_Sonntag,Winter_Werktag)
 
RaphaelW

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2015, 16:39     Titel:
  Antworten mit Zitat      
Das habe ich schon versucht, als Fehlermeldung kommt dann "Too many input arguments".
Also muss ich in der Funktion "Menue" die Anzahl der Eingabeparameter erhöhen bzw. festlegen. Wie kann ich das umsetzen?

Dankeschön für die schnelle Antwort!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.02.2015, 17:36     Titel:
  Antworten mit Zitat      
Hallo RaphaelW,
Zitat:
Das habe ich schon versucht, als Fehlermeldung kommt dann "Too many input arguments".

Bitte poste den Code, mit dem Du es versucht hast. Dann kann man sehr effizient Vorschläge zur Verbesserung machen. Ohne Code ist das dagegen sehr schwierig.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2015, 17:53     Titel:
  Antworten mit Zitat      
Sorry, der Code kommt sofort. Der erste Teil bleibt gleich, hier erfolgt ja nur das Einlesen.


Code:
% Einlesen der gesamten Wertetabelle aus Exceldatei
Profil = xlsread('Verlaeufe.xls',1,'B4:J99');
%Werte in Vektoren für die Jahreszeiten einteilen.
%Winter
Winter_Samstag = Profil(1:96,1)*Anzahl_Haushalte;
Winter_Sonntag = Profil(1:96,2)*Anzahl_Haushalte;
Winter_Werktag = Profil(1:96,3)*Anzahl_Haushalte;


%Hier folgen noch weitere Werte, die eingelesen werden. Hier habe ich die Funktion nun, wie Martin91 geschrieben hat, aufgerufen.

Menue(Winter_Samstag,Winter_Sonntag,Winter_Werktag);



Hierbei habe ich in der Funktion "Menue" noch nichts geändert und es kommt die Fehlermeldung "Too many input arguments".



Wenn ich nun in der Funktion "Menue" versuche, über handles die Eingabeparameter wie folgt abzurufen:

Code:
function OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;

handles.Winter_Samstag = varargin{1};
handles.Winter_Sonntag = varargin{2};
handles.Winter_Werktag = varargin{3};

guidata(hObject, handles);


%Ab hier identisch wie bei meiner Ausgangsfrage

function gui()

% Figure erstellen
h = figure('ToolBar', 'None', ...
  'MenuBar', 'None', ...
  'Resize', 'off', ...
  'Name', 'Plot Selection', ...
  'NumberTitle', 'off', ...
  'Position', [300 300 210 110]);

%usw., siehe oben
 



und anschließend wieder im Skript über
Code:
Menue(Winter_Samstag,Winter_Sonntag,Winter_Werktag);


abzurufen, kommt eine andere Fehlermeldung, und zwar:
"Index exceeds matrix dimensions."
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.02.2015, 18:35     Titel:
  Antworten mit Zitat      
Hallo RaphaelW,

Vom Code für "Menue" fehlt die Zeile mit dem Keyword "function", in der die Anzahl der Input-Werte definiert wird. Aber genau um die geht es hier.

Zitat:
Wenn ich nun in der Funktion "Menue" versuche, über handles die Eingabeparameter wie folgt abzurufen:

Code:
function OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;

Das ist nicht die Funktion "Menue", sondern offensichtlich die Funktion "OpeningFcn".

Zitat:
abzurufen, kommt eine andere Fehlermeldung, und zwar:
"Index exceeds matrix dimensions."

Bitte poste immer die komplette Fehlermeldung. Insbesondere die Zeile, die den Fehler verursacht, muss man unbedingt sehen um herauszufinden, wo das Problem liegt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphaelW
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.02.15
Wohnort: ---
Version: 11b
     Beitrag Verfasst am: 18.02.2015, 13:28     Titel:
  Antworten mit Zitat      
So, ich habe mich nun auch mal angemeldet Wink
Bei meinem Code habe ich die Zeile mit "function" ergänzt. Der komplette Code für "Menue" sieht nun folgendermaßen aus:

Code:
function Menue(Winter_Samstag,Winter_Sonntag,Winter_Werktag)


function gui()

% Figure erstellen
h = figure('ToolBar', 'None', ...
  'MenuBar', 'None', ...
  'Resize', 'off', ...
  'Name', 'Plot Selection', ...
  'NumberTitle', 'off', ...
  'Position', [300 300 210 110]);
 
% Label erstellen
uicontrol(h, 'Style', 'text', ...
  'Position', [10 85 80 15], ...
  'String', 'Jahreszeit', ...
  'HorizontalAlignment', 'Center', 'FontWeight', 'Bold');

uicontrol(h, 'Style', 'text', ...
  'Position', [10 55 80 15], ...
  'String', 'Tag', ...
  'HorizontalAlignment', 'Center', 'FontWeight', 'Bold');
 
% Dropdown-Feld1 erstellen
t = uicontrol(h, 'Style', 'PopupMenu', ...
  'Position', [105 77 100 25], ...
  'String', {'Winter' 'Sommer' 'Uebergang'});
 
% Dropdown-Feld2 erstellen
a = uicontrol(h, 'Style', 'PopupMenu', ...
  'Position', [105 47 100 25], ...
  'String', {'Werktag', 'Samstag', 'Sonntag'});
 
% Button erstellen
uicontrol(h, 'Style', 'PushButton', ...
  'Position', [130 10 75 25], ...
  'String', 'Ok', ...
  'Callback', {@OnOkClick, a, t});

% Quit-Button erstellen
uicontrol(h, 'Style', 'PushButton', ...
  'Position', [20 10 75 25], ...
  'String', 'Quit', ...
  'Callback', {@OnQuitClick});
 
% Figure darstellen
set(h, 'Visible', 'on');

% Click
function [season2, day2] = OnOkClick (obj, e, d, s)
day = get(d, 'String');
day = day{get(d, 'Value')};
day2 = get(d, 'Value');
 
season = get(s, 'String');
season = season{get(s, 'Value')};
season2 = get(s, 'Value');
 
assignin('base', 'day', day);
assignin('base', 'day2', day2);
assignin('base', 'season', season);
assignin('base', 'season2', season2);


switch season2
   
    case 1
       
        switch day2
           
            case 1
                figure ('name','Winter Werk');
                hold on
                plot_slp = plot(Zeit, Winter_Werktag, 'b', 'LineWidth', 1);
                %h1 = fill(Zeit(index([1 1:end end])),[baseLine Winter_Werktag(index)' baseLine],'b','EdgeColor','none');
                datetick('x')
                plot_wasch = plot(Zeit, Winter_Werktag_ohne, 'g','LineWidth', 1);
                %h2 = fill(Zeit(index([1 1:end end])),[baseLine Winter_Werktag_ohne(index)' baseLine],'g','EdgeColor','none');
                plot_last = plot(Zeit, A_w_Werktag, 'r');
                datetick('x')
                title({'Winter Werktag' AnzH AnzA});
                xlabel('Uhrzeit');
                ylabel('kW');
                legend ([plot_slp, plot_wasch, plot_last], 'Plot 1', 'Plot 2','Plot 3','Location','northwest');
                grid on
                hold off
               
% Hier folgen noch weitere Fälle, die ich hier aber weggelassen habe, damit es nicht zu lang wird

        end
       
end

% Quit
function OnQuitClick (obj, e)
close(gcbf);
 



Wenn ich die Funktion nun im Skript über folgenden Code aufrufe:
Code:
Menue(Winter_Samstag,Winter_Sonntag,Winter_Werktag);


wird im Command Window nur angezeigt, dass die Funktion "Menue" aufgerufen wurde, aber es passiert nichts. Die Unterfunktionen "gui" etc. werden also nicht ausgeführt, das Dropdown-Menü erscheint folglich nicht.

Wie kann ich das beheben?

Vielen Dank für die ganzen Antworten!
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphaelW
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.02.15
Wohnort: ---
Version: 11b
     Beitrag Verfasst am: 18.02.2015, 14:07     Titel:
  Antworten mit Zitat      
Die letzte Frage habe ich selber lösen können, ich hatte vergessen die Unterfunktion "gui" aufzurufen.
Der Code sieht nun wie folgt aus:

Code:
function Menue(ZT, SLP_W_W, SLP_W_W_o, A_w_W, AH, AA)
gui(ZT, SLP_W_W, SLP_W_W_o, A_w_W, AH, AA);
return


function gui(ZTT, SLP_Wi_We, SLP_Wi_We_o, A_w_We, AzH, AzA)

% Figure erstellen
h = figure('ToolBar', 'None', ...
  'MenuBar', 'None', ...
  'Resize', 'off', ...
  'Name', 'Plot Selection', ...
  'NumberTitle', 'off', ...
  'Position', [300 300 210 110]);
 
% Label erstellen
uicontrol(h, 'Style', 'text', ...
  'Position', [10 85 80 15], ...
  'String', 'Jahreszeit', ...
  'HorizontalAlignment', 'Center', 'FontWeight', 'Bold');

uicontrol(h, 'Style', 'text', ...
  'Position', [10 55 80 15], ...
  'String', 'Tag', ...
  'HorizontalAlignment', 'Center', 'FontWeight', 'Bold');
 
% Dropdown-Feld1 erstellen
t = uicontrol(h, 'Style', 'PopupMenu', ...
  'Position', [105 77 100 25], ...
  'String', {'Winter' 'Sommer' 'Uebergang'});
 
% Dropdown-Feld2 erstellen
a = uicontrol(h, 'Style', 'PopupMenu', ...
  'Position', [105 47 100 25], ...
  'String', {'Werktag', 'Samstag', 'Sonntag'});
 
% Button erstellen
uicontrol(h, 'Style', 'PushButton', ...
  'Position', [130 10 75 25], ...
  'String', 'Ok', ...
  'Callback', {@OnOkClick, a, t, ZTT, SLP_Wi_We, SLP_Wi_We_o, A_w_We, AzH, AzA});

% Quit-Button erstellen
uicontrol(h, 'Style', 'PushButton', ...
  'Position', [20 10 75 25], ...
  'String', 'Quit', ...
  'Callback', {@OnQuitClick});
 
% Figure darstellen
set(h, 'Visible', 'on');

% Click
function [season2, day2] = OnOkClick (obj, e, d, s, Time, SLPWiWe, SLPWiWe_ohne, A_w_Werk, AnzHaus, AnzAlles)
day = get(d, 'String');
day = day{get(d, 'Value')};
day2 = get(d, 'Value');
 
season = get(s, 'String');
season = season{get(s, 'Value')};
season2 = get(s, 'Value');

Zeit = get(Time, 'Value');
SLP_Winter_Werktag = get(SLPWiWe, 'Value');
SLP_Winter_Werktag_ohne = get(SLPWiWe_ohne, 'Value');
A_w_Werktag = get(A_w_Werk, 'Value');
AnzH = get(AnzHaus, 'Value');
AnzA = get(AnzAlles, 'Value');
 
assignin('base', 'day', day);
assignin('base', 'day2', day2);
assignin('base', 'season', season);
assignin('base', 'season2', season2);

assignin('base', 'Zeit', Zeit);
assignin('base', 'SLP_Winter_Werktag', SLP_Winter_Werktag);
assignin('base', 'SLP_Winter_Werktag_ohne', SLP_Winter_Werktag_ohne);
assignin('base', 'A_w_Werktag', A_w_Werktag);
assignin('base', 'AnzH', AnzH);
assignin('base', 'AnzA', AnzA);

switch season2
   
    case 1
       
        switch day2
           
            case 1
                figure ('name','Winter Werk');
                hold on
                plot_slp = plot(Zeit, SLP_Winter_Werktag, 'b', 'LineWidth', 1);
                %h1 = fill(Zeit(index([1 1:end end])),[baseLine SLP_Winter_Werktag(index)' baseLine],'b','EdgeColor','none');
                datetick('x')
                plot_wasch = plot(Zeit, SLP_Winter_Werktag_ohne, 'g','LineWidth', 1);
                %h2 = fill(Zeit(index([1 1:end end])),[baseLine SLP_Winter_Werktag_ohne(index)' baseLine],'g','EdgeColor','none');
                plot_last = plot(Zeit, A_w_Werktag, 'r');
                datetick('x')
                title({'Winter Werktag' AnzH AnzA});
                xlabel('Uhrzeit');
                ylabel('kW');
                legend ([plot_slp, plot_wasch, plot_last], 'Plot 1', 'Plot 2','Plot 3','Location','northwest');
                grid on
                hold off
               
% Hier folgen noch weitere Fälle, die ich hier aber weggelassen habe, damit es nicht zu lang wird

        end
       
end

% Quit
function OnQuitClick (obj, e)
close(gcbf);



Wenn ich die Funktion nun aufrufe:
Code:
Menue(Zeit, SLP_Winter_Werktag, SLP_Winter_Werktag_ohne, A_w_Werktag, AnzH, AnzA);


wird das Dropdown-Menü auch angezeigt und die Buttons funktionieren auch. Es erscheint jedoch folgende Fehlermeldung:

"Error using handle.handle/get
Invalid or deleted object.

Error in Menue_Neu>OnOkClick (line 70)
Zeit = get(Time, 'Value');

Error while evaluating uicontrol Callback"


Woran kann das liegen?
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphaelW
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.02.15
Wohnort: ---
Version: 11b
     Beitrag Verfasst am: 18.02.2015, 14:43     Titel:
  Antworten mit Zitat      
Ich habe den Fehler selber gefunden, die Funktion "get" ist an dieser Stelle einfach falsch, ich bekomme den Wert ja nicht von einem Interface, wie bei den Variablen "day2" und "season2". Ich kann die Eingangsvariablen der Funktion "OnOkClick" ja direkt weiterverwenden. Ein klarer Denkfehler ..

Code:
function [season2, day2] = OnOkClick (obj, e, d, s, Zeit, SLP_Winter_Werktag, SLP_Winter_Werktag_ohne, A_w_Werktag, AnzH, AnzA)
day = get(d, 'String');
day = day{get(d, 'Value')};
day2 = get(d, 'Value');
 
season = get(s, 'String');
season = season{get(s, 'Value')};
season2 = get(s, 'Value');

assignin('base', 'day', day);
assignin('base', 'day2', day2);
assignin('base', 'season', season);
assignin('base', 'season2', season2);


switch season2
   
    case 1
       
        switch day2
           
            case 1
                figure ('name','Winter Werk');
                hold on
                plot_slp = plot(Zeit, SLP_Winter_Werktag, 'b', 'LineWidth', 1);
                %h1 = fill(Zeit(index([1 1:end end])),[baseLine SLP_Winter_Werktag(index)' baseLine],'b','EdgeColor','none');
                datetick('x')
                plot_wasch = plot(Zeit, SLP_Winter_Werktag_ohne, 'g','LineWidth', 1);
                %h2 = fill(Zeit(index([1 1:end end])),[baseLine SLP_Winter_Werktag_ohne(index)' baseLine],'g','EdgeColor','none');
                plot_last = plot(Zeit, A_w_Werktag, 'r');
                datetick('x')
                title({'Winter Werktag' AnzH AnzA});
                xlabel('Uhrzeit');
                ylabel('kW');
                legend ([plot_slp, plot_wasch, plot_last], 'Plot 1', 'Plot 2','Plot 3','Location','northwest');
                grid on
                hold off
               
% Hier folgen noch weitere Fälle, die ich hier aber weggelassen habe, damit es nicht zu lang wird

        end
       
end




Nun funktioniert alles so wie es soll, herzlichen Dank nochmal für die Hilfe, besonders an Jan S!
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.