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

Variablen übertragen

 

Gorbi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2008, 11:14     Titel: Variablen übertragen
  Antworten mit Zitat      
Sehr geehrte Matlab-"Profis",

erst seit kurzem arbeite ich mit diesem mächtigen und vielseitigen Hilfsmittel und komme, Dank der eingebauten Hilfe und diesem Forum, zunehmend voran. Allerdings komme ich bei einer Sache noch nicht voran, obwohl ich hier schon mindestens 30 Beiträge durchforstet, die Suche bemüht ("function", "handles" usw.) und einiges ausprobiert habe: Ich schaffe es nicht, Variablen von einem Hauptprogramm (*.m) in eine GUI-Datei (auch *.m, aber mit zugehöriger, in GUIDE erstellter *.fig-Datei) zu übergeben und umgekehrt.

Konkret sieht das so aus:
im Hauptprogramm.m wird eine Datei eingelesen, aus der einige Variablen bestimmt werden, min_y, max_y, min_z und max_z.

Danach möchte ich, daß ein GUI namens Unterprogramm.m aufgeht, das mir diese Parameter anzeigt, in dem ich aber noch zusätzliche Werte und Optionen für die nachfolgenden Berechnungen eingeben kann.
Das GUI alleine funktioniert auch (wenn ich "Unterprogramm.m" im Editor-Fenster mit F5 starte).

Aufgerufen wird das GUI im Hauptprogramm mit der Zeile
PP=Unterprogramm(min_y, max_y, min_z, max_z);
uiwait(PP);

in der Hoffnung, daß das Feld "PP" alle Variablen enthält, die das Unterprogramm zurückgibt, in diesem Fall "y_min_neu", "y_max_neu", "z_min_neu" und "z_max_neu"). Ohne "uiwait" würde das Hauptprogramm einfach weiterlaufen, ohne sich um das Unterprogramm zu scheren.
Lasse ich im Hautprogramm probeweise "PP" ausgeben (disp(PP);), erscheint nur die Zahl "158.0281".
Dann habe ich es mit "FFF = getappdata(0,'Unterprogramm');" versucht, doch "disp(FFF);" gibt überhaupt nichts aus.

So, wie ich es verstanden habe, müßte "PP" sowieso ein Feld sein, das alle Variablen enthält, die das Unterprogramm zurückgibt, doch
der Versuch, eine dieser Variablen mit "disp(PP{2})" anzuzeigen, ergibt die Fehlermeldung "Cell contents reference from a non-cell array object."
Der Versuch "y_max_neu=PP{2};" liefert mir natürlich die gleiche Fehlermeldung.

Das Unterprogramm beginnt mit "function varargout = Unterprogramm(varargin)", dann folgt die GUI-Initialisierung. Bevor die einzelnen Callback-Funtionen auftauchen, hätte ich gerne die Variablen aus dem Hauptprogramm im Unterprogramm, damit sie dort (z. B. mit "set(handles.Y1, 'String', min_y);") in Textfeldern angezeigt oder anderweitig verwertet werden können.

Da nach meinem Verständnis das Feld "varargin" die Variablen aus dem Hauptprogramm enthalten, versuche ich es mit
"y_min = varargin{1}; y_max = varargin{2}; z_min = varargin{3}; z_max = varargin{4};", und zwar nach der Initialisierung und vor
"function Unterprogramm_OpeningFcn(hObject, eventdata, handles, varargin)" und
"function varargout = Unterprogramm_OutputFcn(hObject, eventdata, handles)", schließlich sollen die Variablen ja in der ganzen GUI gelten.
Doch diese Art der Zuordnung liefert unsinnige Werte für die Variablen und letztendlich die Fehlermeldung "Index exceeds matrix dimensions."
Das einzige was ich daraus schließen konnte, ist, daß die GUI anscheinend bei jeder Benutzeraktion (Anklicken eines Knopfen o. ä.) erneut komplett durchlaufen wird.
Beendet wird das GUI mit einem "Weiter"-Knopf und den Befehlen
guidata(hObject, handles);
setappdata(0,'handles_Eingabemaske6',handles);
delete(Eingabemaske6); %Schließen des Eingabefensters.


Im Anschluß findet Ihr das komplette Listing des Unterprogramms.
Danke im voraus für Eure Hilfe! Smile

Viele Grüße
Gorbi



function varargout = Eingabemaske6(varargin)

% Initialisierung:
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Eingabemaske6_OpeningFcn, ...
'gui_OutputFcn', @Eingabemaske6_OutputFcn, ...
'gui_LayoutFcn', [], ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% Ende der Initialisierung.

%y_min = varargin{1}; y_max = varargin{2}; z_min = varargin{3}; z_max = varargin{4};
%minimales_y = varargin{5}; maximales_y = varargin{6}; minimales_z = varargin{7}; maximales_z = varargin{8};
%display (y_min); %display (minimales_z);

% --- Executes just before Eingabemaske6 is made visible.
function Eingabemaske6_OpeningFcn(hObject, eventdata, handles, varargin)


% Choose default command line output for Eingabemaske6
handles.output = hObject;

%Hinzufügen der Variablen zur handles-Struktur:
set(handles.Maximalknopf,'Value', 0); %nicht aktiviert
set(handles.Unveraendertknopf,'Value', 0); %nicht aktiviert
set(handles.Beliebigknopf,'Value', 1); % aktiviert

% Aktualisieren der handles-Struktur:
guidata(hObject, handles);

% UIWAIT makes Eingabemaske6 wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% Übernahme der Variablen aus dem Hauptprogramm:
% disp(varargin{1}); disp(varargin{2}); disp(varargin{3}); disp(varargin{4});
%min_y=varargin{1};max_y=varargin{2};min_z=varargin{3};max_z=varargin{4};

%handles.min_y=varargin{1};handles.max_y=varargin{2};handles.min_z=varargin{3};handles.max_z=varargin{4};
%disp(handles.min_y); disp(handles.max_y); disp(handles.min_z); disp(handles.max_z);

% --- Outputs from this function are returned to the command line.
function varargout = Eingabemaske6_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

minimales_y='-3.14159265358'; maximales_y='299792458'; minimales_z='-1000'; maximales_z='1000'; % <-- Testvariablen für maximale Gittergröße
%minimales_y=-558; maximales_y=846; minimales_z=-270; maximales_z=129; % <-- Testvariablen für maximale Gittergröße
set(handles.y_minimal, 'String', minimales_y);
set(handles.y_maximal, 'String', maximales_y);
set(handles.z_minimal, 'String', minimales_z);
set(handles.z_maximal, 'String', maximales_z);
guidata(hObject, handles);

min_y='-1'; max_y='10'; min_z='-3.141'; max_z='2.717'; % <-- Testvariablen für eingelesene Gittergröße
%min_y='-558'; max_y='846'; min_z='-270'; max_z='129'; % <-- Testvariablen für eingelesene Gittergröße

set(handles.Y1, 'String', min_y);
set(handles.Y2, 'String', max_y);
set(handles.Z1, 'String', min_z);
set(handles.Z2, 'String', max_z);

guidata(hObject, handles);

% Ist wohl überflüssig, ich hatte bloß keine Lust mehr, die FIG-Datei neuzumachen:
function Auswahlmenu_Interpolation_CreateFcn(hObject, eventdata, handles)

% Auswahl des Interpolationsgrades in einem Runterklapp-Menü:
function Auswahlmenu_Interpolation_Callback(hObject, eventdata, handles)


% Korrektur des Gitternullpunktes in y-Richtung:
function y_Korrektur_Callback(hObject, eventdata, handles)
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
yKorrektur = get(hObject, 'string'); Komma = strfind(yKorrektur, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Y_Korrektur = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Y_Korrektur) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end


% Korrektur des Gitternullpunktes in z-Richtung:
function z_Korrektur_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
zKorrektur = get(hObject, 'string'); Komma = strfind(zKorrektur, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Z_Korrektur = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Z_Korrektur) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end

% Eingabemöglichkeit beliebiger Gittereckpunkte (frei wählbare Gittergröße):
function Ymin_beliebig_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
YminEingabe = get(hObject, 'string'); Komma = strfind(YminEingabe, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Y_min_neu = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Y_min_neu) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end

function Ymax_beliebig_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
YmaxEingabe = get(hObject, 'string'); Komma = strfind(YmaxEingabe, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Y_max_neu = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Y_max_neu) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end

function Zmin_beliebig_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
ZminEingabe = get(hObject, 'string'); Komma = strfind(ZminEingabe, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Z_min_neu = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Z_min_neu) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end

function Zmax_beliebig_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
ZmaxEingabe = get(hObject, 'string'); Komma = strfind(ZmaxEingabe, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Z_max_neu = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl.
if isnan(Z_max_neu) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden.
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end

% Abfrage der gewünschten neuen Gittergröße über "Radioknöpfe":
function Maximalknopf_Callback(hObject, eventdata, handles)
Knopf2 = get(handles.Maximalknopf,'Value');
if (Knopf2 == 1)
handles.Y_min_neu=str2num(get(handles.y_minimal, 'String'));
handles.Y_max_neu=str2num(get(handles.y_maximal, 'String'));
handles.Z_min_neu=str2num(get(handles.z_minimal, 'String'));
handles.Z_max_neu=str2num(get(handles.z_maximal, 'String'));
% Aktualisierung der Textfelder für beliebige Gittergröße:
set(handles.Ymin_beliebig,'String', get(handles.y_minimal, 'String'));
set(handles.Ymax_beliebig,'String', get(handles.y_maximal, 'String'));
set(handles.Zmin_beliebig,'String', get(handles.z_minimal, 'String'));
set(handles.Zmax_beliebig,'String', get(handles.z_maximal, 'String'));
guidata(hObject, handles);
end

function Unveraendertknopf_Callback(hObject, eventdata, handles)
Knopf1 = get(handles.Unveraendertknopf,'Value');
if (Knopf1 == 1)
handles.Y_min_neu=str2num(get(handles.Y1, 'String'));
handles.Y_max_neu=str2num(get(handles.Y2, 'String'));
handles.Z_min_neu=str2num(get(handles.Z1, 'String'));
handles.Z_max_neu=str2num(get(handles.Z2, 'String'));
% Aktualisierung der Textfelder für beliebige Gittergröße:
set(handles.Ymin_beliebig,'String', get(handles.Y1, 'String'));
set(handles.Ymax_beliebig,'String', get(handles.Y2, 'String'));
set(handles.Zmin_beliebig,'String', get(handles.Z1, 'String'));
set(handles.Zmax_beliebig,'String', get(handles.Z2, 'String'));
guidata(hObject, handles);
end


function Beliebigknopf_Callback(hObject, eventdata, handles)


function Weiterknopf_Callback(hObject, eventdata, handles)
%uiresume;

% Abfragen des gewünschten Interpolationsgrades:
Interpolationsauswahl = get(handles.Auswahlmenu_Interpolation,'Value');
switch Interpolationsauswahl;
case 1 % ' kubisch'
handles.Interpolationsgrad = 3;
case 2 % ' quadratisch'
handles.Interpolationsgrad = 2;
case 3 % ' linear'
handles.Interpolationsgrad = 1;
case 4 % ' alle Werte auf Null'
handles.Interpolationsgrad = 0;
end


%Auslesen der Textfeldinhalte:
handles.Y_Korrektur = str2num(get(handles.y_Korrektur, 'String'));
handles.Z_Korrektur = str2num(get(handles.z_Korrektur, 'String'));
handles.Y_min_neu = str2num(get(handles.Ymin_beliebig, 'String'));
handles.Y_max_neu = str2num(get(handles.Ymax_beliebig, 'String'));
handles.Z_min_neu = str2num(get(handles.Zmin_beliebig, 'String'));
handles.Z_max_neu = str2num(get(handles.Zmax_beliebig, 'String'));
guidata(hObject, handles);

% Schreiben der neuen Parameter in die Übergabestruktur "Varargout":
varargout{2} = handles.Interpolationsgrad;
varargout{3} = handles.Y_Korrektur;
varargout{4} = handles.Z_Korrektur;
varargout{5} = handles.Y_min_neu;
varargout{6} = handles.Y_max_neu;
varargout{7} = handles.Z_min_neu;
varargout{8} = handles.Z_max_neu;

% Kontrollausgabe im Kommandozeilenfenster:
disp ('Interpolationsgrad: '); disp (handles.Interpolationsgrad);
disp ('y-Korrektur: '); disp (handles.Y_Korrektur);
disp ('z-Korrektur: '); disp (handles.Z_Korrektur);
disp ('Y min. neu = '); disp (handles.Y_min_neu);
disp ('Y max. neu = '); disp (handles.Y_max_neu);
disp ('Z min. neu = '); disp (handles.Z_min_neu);
disp ('Z max. neu = '); disp (handles.Z_max_neu);

guidata(hObject, handles);

setappdata(0,'handles_Eingabemaske6',handles);

delete(Eingabemaske6); %Schließen des Eingabefensters.


dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2008, 13:28     Titel:
  Antworten mit Zitat      
Hallo,
so wie es aussieht, wird dir ein Handle auf die GUI übergeben (sonst würde uiwait auch nicht funktionieren).

Code:
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% Ende der Initialisierung.


Dieser Teil dürfte die Ausgabeparameter regeln (varargout ist ein Cell-Array das die Ausgabewerte beinhält, nargout die Anzahl der Ausgabeparameter). Versuch mal mehr Ausgabevariablen mitanzugeben, vielleicht ändert sich ja da schon was.
Code:
[PP1 PP2 PP3 PP4] = Unterprogramm...
Da ich mit GUIDE nicht programmiere, kenne ich leider die Syntax nicht wirklich (gui_mainfcn).

Falls dies nicht funktioniert (wovon ich mal ausgehe), musst du in der gui_mainfcn die Ausgabevariable varargout auch dementsprechend belegen.

Alternativ kannst du natürlich auch die Werte direkt in die GUI schreiben und auslesen. Alles was du dafür brauchst, ist das handle auf die GUI (oder ein Objekt in der GUI). Siehe dazu
Code:


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Gorbi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2008, 14:57     Titel: EIn Beispiel möglich?
  Antworten mit Zitat      
Hallo, dibor, Danke für Deine Antwort! Smile

dib0r hat Folgendes geschrieben:

so wie es aussieht, wird dir ein Handle auf die GUI übergeben (sonst würde uiwait auch nicht funktionieren).

Und wo wird dieses Handle angelegt? Ich dachte, das macht erst das GUI?

Zitat:

Dieser Teil [s.o.] dürfte die Ausgabeparameter regeln (varargout ist ein Cell-Array, das die Ausgabewerte beinhält, nargout die Anzahl der Ausgabeparameter). Versuch mal mehr Ausgabevariablen mitanzugeben, vielleicht ändert sich ja da schon was.
Code:
[PP1 PP2 PP3 PP4] = Unterprogramm...
Da ich mit GUIDE nicht programmiere, kenne ich leider die Syntax nicht wirklich (gui_mainfcn).

Falls dies nicht funktioniert (wovon ich mal ausgehe)


Ja, das funktioniert nicht. Es kommt dann die Fehlermeldung, ich hätte zu viele Ausgabevariablen ("Error using ==> Eingabemaske6>Eingabemaske6_OutputFcn
Too many output arguments.
"). Mein Unterprogramm heißt hier "Eingabemaske6", nicht, daß es zur Verwirrung kommt. Wink

Füge ich in die Initialisierungssequenz des Unterprogramms die Zeile
Code:
ein (ich will sieben Variablen ins Hauptprogramm zurückgeben, und varargout{1} ist ja bereits automatisch reserviert worden durch
Code:
% Get default command line output from handles structure
varargout{1} = handles.output;

und lasse das Unterprogramm testweise alleine laufen (das muß es ja können), erhalte ich wieder eine Meldung à la "zuviele Ausgabeargumente" und noch einen Rattenschwanz, der sich auf die gui_mainfcn bezieht.

Zitat:
musst du in der gui_mainfcn die Ausgabevariable varargout auch dementsprechend belegen.

Wie kann ich das tun? (Entschuldige diese, für erfahrene Anwender sicher triviale Frage.)
Wo und was ist eigentlich diese "gui_mainfcn", in der Hilfe steht dazu nichts?

Zitat:
Alternativ kannst du natürlich auch die Werte direkt in die GUI schreiben und auslesen. Alles was du dafür brauchst, ist das handle auf die GUI (oder ein Objekt in der GUI). Siehe dazu
Code:

Hm, mit
Code:
guidata(hObject, handles);
wird ja, so wie ich verstanden habe, das Handles-Feld ("Cell-Array") aktualisiert, d. h. alle, in den Callbacks gewonnenen, Handles in diesem Feld abgespeichert.
Versuche ich nun, im Hauptprogramm mit
Code:
KKK=guidata(handles.Y_min_neu);

aus diesem Feld wieder eine Variable herauszuziehen und "KKK" zuzuordnen, kennt er kein "handles" mehr und dankt es mit der Fehlermeldung "??? Undefined function or variable 'handles'.
Error in ==> Hauptprogramm_7 at 93
KKK=guidata(handles.Y_min_neu);
".
Die Hilfe hat mich über guidata nicht wirklich schlauer gemacht.
Wäre es möglich, mir einfach ein kurzes Beispiel zu geben à la:
Code:

Hauptprogramm
.
.
.
a=1; b=2; c=3;

% Aufrufen des Unterprogramms mit den zu übergebenden Variablen a, b und c und den "zurückerwarteten" Variablen a_neu, b_neu und c_neu:
[a_neu b_neu c_neu]=Unterprogramm(a, b, c);

% Warten, bis Unterprogramm fertig:
uiwait(Unterprogramm);
.
.
.
disp(a_neu); disp(b_neu); disp(c_neu);


Unterprogramm (GUI):
Code:

function varargout = Unterprogramm(varargin)

%Muß ich etwas an der Initialisierung ändern? Standardmäßig steht da immer "DO NOT EDIT!"

% Laden der Variablen aus dem Hauptprogramm:
a=???; % Was muß das stehen?
b=???;
c=???;

% Verrechnung dieser Variablen:
a_neu=a+1; b_neu=sqrt(b+2); c_neu=sin(b+c);

% Diverse Auswahlmenüs und Eingaben ergeben zusätzlich:
d=4; e=5;

% Übergabe in das Cell-Array "handles":
handles.a=a_neu;
handles.b=b_neu;
handles.c=c_neu;
handles.d=d;
handles.e=e;
guidata(hObject, handles); % Muß da immer "hObject" stehen?

function Weiterknopf_Callback(hObject, eventdata, handles)

% Abspeichern im Transfer-Array "varargout":
varargout{1} = handles.a;
varargout{2} = handles.b;
varargout{3} = handles.c;
varargout{4} = handles.d;
varargout{5} = handles.e;

% Schließen des Unterprogramms:
delete (Unterprogramm);
 


Viele Grüße
Gorbi Smile
 
Gorbi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2008, 15:02     Titel: Korretur
  Antworten mit Zitat      
Sorry, ich kann meinen Beitrag nicht editieren, es hat sich im Beispiel ein Fehler eingeschlichen:
Statt
Code:

% Aufrufen des Unterprogramms mit den zu übergebenden Variablen a, b und c und den "zurückerwarteten" Variablen a_neu, b_neu und c_neu:
[a_neu b_neu c_neu]=Unterprogramm(a, b, c);


muß es natürlich heißen
Code:

% Aufrufen des Unterprogramms mit den zu übergebenden Variablen a, b und c und den "zurückerwarteten" Variablen a_neu, b_neu, c_neu, d und e:
[a_neu b_neu c_neu d e]=Unterprogramm(a, b, c);
 


Danke.
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2008, 16:23     Titel:
  Antworten mit Zitat      
Hallo,

nunja, nargout liefert nur die Ausgabeparameter im Funktionsaufruf zurück. z.B. ist beim Funktionsaufruf
Code:
[x1 x2 x3 x4 x5] = meineFunktion(a1,a2)
nargout gleich 5 (normalerweise setzt man nargout nicht manuell, sondern überprüft nur wieviele Argumente reinkommen wenn man keine konstante Anzahl an Ausgabevariablen hat / haben will). Allerdings muss dann auch varargout von 1-5 gehen, d.h. varargout{5} muss existieren, ansonsten kommt die von dir beschriebene Fehlermeldung.

Sorry, ich meinte das handle wird zurückgegeben, nicht übergeben Smile d.h. die GUI legt dies an und gibt dir das handle (eine Zahl) zurück, über die du die GUI ansprechen kannst.
z.B.
Code:
h = figure;set(h,'Visible','off');
h wäre nun so ein handle.

Nunja, die gui_mainfcn sollte eigentlich irgendwo in der m-Datei oder im Figure existieren. Wie gesagt, ich erstelle meine GUIs nicht mit GUIDE, sondern direkt als m-Datei.

Dieser Teil hier
Code:
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% Ende der Initialisierung.
besagt, dass wenn mindestens eine Ausgabevariable beim Funktionsaufruf existiert (nargout > 0), dann dienen alle Ausgabevariablen der Funktion "gui_mainfcn" auch als Ausgabe der Funktion Eingabemaske6. gui_mainfcn wird mit den Eingabevariablen gui_State, die ja weiter oben initialisiert wird, und varargin, praktisch den Eingabeparametern der Funktion Eingabemaske6, versehen.
Nun müsstest du eigentlich die Funktion suchen (evtll mal in GUIDE nachlesen wie dort GUIs erstellt werden) und die von dir gewünschten Variablen / Werte zurückgeben lassen.

Zu
Code:
:
Diese Funktion wird auf 2 Arten genutzt:
Code:
schreibt Daten in das Objekt hObject,
Code:
data = guidata(hObject)
liest Daten aus dem Object hObject und schreibt diese dann nach data. Falls du an irgendeiner Stelle mal Daten in die GUI (oder ein Objekt der GUI) schreibst, kannst du die an jeder beliebigen Stelle auslesen, vorausgesetzt du kennst das handle eines Objektes der GUI und die GUI exisitert noch.

Nunja, ich schreib mal hier ein Beispiel rein:
Code:
function varargout = meineGUI(varargin)

% Erzeuge ein figure
h = figure;
% plotte sinus
plot(sin(0:.01:2*pi));
% erzeuge Daten
if ~nargin
    A = rand(100,30);
else
    A = varargin{1};
end
[U S V] = svd(A);
data.A = A;
data.U = U;
data.S = S;
data.V = V;
% schreibe Daten in die GUI
guidata(h,data);
% definiere Rückgabewerte
if nargout > 0
   varargout{1} = h;
end
if nargout > 1
  varargout{2} = A;
end
if nargout > 2
   varargout{3} = U;
end
if nargout > 3
   varargout{4} = S;
end
if nargout > 4
   varargout{5} = V;
end

if nargout > 5
   error('Nix da! Kann nur maximal 5 Werte ausgeben!');
end

return


Soweit zu der Funktion. Der Funktionsaufruf erfolgt mit
Code:
[h A U S V] = meineGUI(magic(5));
Du kannst dann mit
Code:
jederzeit die Daten rausholen. data ist eine Struktur mit den Feldern A, U, S und V. Diese Werte sollten identisch sein mit denen, die du als Rückgabewerte erhälst. Falls du in die Funktion keine Daten übergibst (nargin = 0), werden zufällige Werte generiert. Alle Variablen, die du auf der linken Seite des Funktionsaufrufes angibst, werden auch belegt (maximal 5).

Ich hoffe dass es einigermaßen verständlich erklärt wurde. Wie erwähnt, GUIDE ist nicht mein Fall.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2008, 16:44     Titel:
  Antworten mit Zitat      
Entschuldige für Doppel-Post (ich könnte editieren Razz )

Zitat:
Unterprogramm (GUI):
Code:

Code:
function varargout = Unterprogramm(varargin)

%Muß ich etwas an der Initialisierung ändern? Standardmäßig steht da immer "DO NOT EDIT!"

% Laden der Variablen aus dem Hauptprogramm:
a=???; % Was muß das stehen?
b=???;
c=???;

%%%%%%%%%%%%%
a = varargin{1};
b = varargin{2};
c = varargin{3};
%%%%%%%%%%%%%

% Verrechnung dieser Variablen:
a_neu=a+1; b_neu=sqrt(b+2); c_neu=sin(b+c);

% Diverse Auswahlmenüs und Eingaben ergeben zusätzlich:
d=4; e=5;

% Übergabe in das Cell-Array "handles":
%%%%%%%%%%%%
handles ist eine Struktur, kein Cell-Array
%%%%%%%%%%%%
handles.a=a_neu;
handles.b=b_neu;
handles.c=c_neu;
handles.d=d;
handles.e=e;
guidata(hObject, handles); % Muß da immer "hObject" stehen?

%%%%%%%%%%%%%%%%
Nein, hObject existiert hier nicht. Hier sollte ein handle zu einem Objekt in deiner GUI stehen. Allerdings sehe ich hier irgendwie kein GUI-Objekt. z.B. figure_handle = figure;
Dann muss hier
guidata(figure_handle, handles)
stehen. Allerdings ist der Variablenname handles irgendwie schlecht gewählt. Nimm lieber s für struct oder data oder sonstwas (handles sind so eine Art Adressen bzw. Links für (graphische) Objekte).
%%%%%%%%%%%%%%%%

function Weiterknopf_Callback(hObject, eventdata, handles)
%%%%%%%%%%%%%%%%
hm, dir fehlt in dieser Funktion "varargout".
function varargout = Weiterknopf_Callback(hObject, eventdata, handles)
müsste das vermutlich heissen. Allerdings gibt es für Callback-Funktionen glaub ich keine Rückgabewerte.
%%%%%%%%%%%%%%%%

% Abspeichern im Transfer-Array "varargout":
varargout{1} = handles.a;
varargout{2} = handles.b;
varargout{3} = handles.c;
varargout{4} = handles.d;
varargout{5} = handles.e;

% Schließen des Unterprogramms:
delete (Unterprogramm);
 
%%%%%%%%%%%%%%%%%%
Problem an dieser Sache: sobald deine GUI gelöscht wird, kannst du auch nicht mehr ansprechen bzw. alle Daten der GUI sind weg. Ausserdem ist Unterprogramm ja eine Funktion (und kein handle auf ein Objekt) und kann somit nicht gelöscht werden.
%%%%%%%%%%%%%%%%%%
 


Viele Grüße
Gorbi Smile


Falls du die Zeile mit delete, die Zeile mit der Callback-Funktion und die Zeile mit dem guidata weglässt, sollte das ganze funktionieren. Allerdings erhälst du dann keine GUI, sondern eine "normale" Funktion, die Eingabewerte manipuliert und ausgibt.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Gorbi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2008, 11:26     Titel: Noch Fragen...
  Antworten mit Zitat      
dib0r hat Folgendes geschrieben:
Entschuldige für Doppel-Post (ich könnte editieren Razz )

Na und? Von mir aus könntest Du fünffach posten. Immerhin versuchst Du mir weiterzuhelfen. Smile

Code:
a = varargin{1};
b = varargin{2};
c = varargin{3};

Genauso habe ich es versucht. Lasse ich mir die Variablen z. B. mit
Code:
ausgeben, wird sie interesanterweise mehrfach ausgegeben. Erst steht da unsinnigerweise

a=
Auswahlmenu_Interpolation_CreateFcn
,
er setzt also die Variable a gleich dem Namen irgendeiner "weiter unten" eingebetteten GUI-Unterfunktion;

darunter erscheint erstaunlicherweise der korrekte Wert, z. B.
a=
1


und danach wird anscheinend das gesamte Unterprogramm jedesmal auf's neue durchlaufen, wenn ich im dem GUI irgendeine Aktion ausführe (einen Knopf anklicke o. ä.), wobei a bzw. varargin{1} nach jeder Aktion mit dem Namen des entsprechenden Callback versehen wird!

Mit vararg{2} habe ich auch nicht mehr Glück; hier wird der korrekte Wert ebenfalls "beim zweiten Mal" angezeigt, danach erscheinen kryptische Zahlen bei jeder Aktion in der GUI.

Dabei ist es völlig wurst, an welcher Stelle des Unterprogramms ich die Variablen aus varargin ziehe. Beim Anklicken des Weiter-Knopfes erscheint letztendlich die Fehlermeldung, der Index überschreite die Matrix-Dimension von varargin.
Was mich nicht wundert, da sich nargin und nargout anscheinend mehrfach ändern. (DAS wundert mich dann.)

Zitat:
guidata(hObject, handles); % Muß da immer "hObject" stehen?

%%%%%%%%%%%%%%%%
Nein, hObject existiert hier nicht. Hier sollte ein handle zu einem Objekt in deiner GUI stehen. Allerdings sehe ich hier irgendwie kein GUI-Objekt. z.B. figure_handle = figure;

Tja, so wurde es von GUIDE automatisch generiert, und in den Hilfe-Beispielen steht da auch immer "hObject" drin.
Die Figures stehen in der FIG-Datei, und wenn ich in der M-Datei zu viel verändere, geht gar nichts mehr, weil sie nicht mehr mit der FIG-Datei übereinstimmt. GUIDE erzeugt nämlich erst die FIG-Datei und daraus dann die M-Datei, in der wir uns gerade "bewegen".

Zitat:
Dann muss hier
guidata(figure_handle, handles)
stehen. Allerdings ist der Variablenname handles irgendwie schlecht gewählt. Nimm lieber s für struct oder data oder sonstwas (handles sind so eine Art Adressen bzw. Links für (graphische) Objekte).

Gut, doch auch diese Syntax steht so in den Beispielen bzw. wurde von GUIDE so generiert.

Zitat:
hm, dir fehlt in dieser Funktion "varargout".
function varargout = Weiterknopf_Callback(hObject, eventdata, handles)
müsste das vermutlich heissen.

Das habe ich jetzt so geändert, wie Du es vorgeschlagen hast. Es hat nicht geschadet, aber auch erst einmal nichts bewirkt. Smile)

Zitat:
% Schließen des Unterprogramms:
delete (Unterprogramm);

%%%%%%%%%%%%%%%%%%
Problem an dieser Sache: sobald deine GUI gelöscht wird, kannst du auch nicht mehr ansprechen bzw. alle Daten der GUI sind weg. Ausserdem ist Unterprogramm ja eine Funktion (und kein handle auf ein Objekt) und kann somit nicht gelöscht werden.

Wie kriege ich die GUI dann weg? Mit 'Visible', 'off' nur unsichtbar machen?
Eigentlich wollte ich im Hauptprogramm die Variablen vor dem Befehl "uiwait" übernehmen - "handles" wird ja im Unterprogramm nach jeder Aktion aktualisiert - und dann das Unterprogramm weghaben ("delete").

Puh, diese GUI-Geschichte erscheint mir etwas unlogisch, oder ich bin zu blöd dazu. Ich probiere weiter, doch falls Dir noch ein guter Tip einfällt, bin ich immer dankbar. *g*

Viele Grüße und schönes WE
Gorbi Smile
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2008, 11:46     Titel:
  Antworten mit Zitat      
Hallo,

aha, anscheinend hat GUIDE das so gelöst, dass es "Unterprogramm" mehrfach aufruft, je nachdem was gemacht werden soll, werden einfach die Eingabeparameter angepasst (vermutlich dienen dazu die Namen der Funktion / Callbacks).
Nunja, da ich persönlich von GUIDE nicht viel halte, kann ich dich nur auf mein obiges Beispiel verweisen (das mit dem Sinus-Plot). Mit
Code:
kannst du dann manuell auch alle Elemente (Buttons, EditFelder usw.) hinzufügen. Ist zwar ein bisschen Arbeit, aber aus meiner Sicht lohnt sich das.

Ansonsten kann ich dir auch nicht mehr wirklich weiterhelfen, da ich das Konzept von GUIDE bzw. die Abhängigkeiten zwischen m-Datei und fig-Datei nicht so ganz nachvollziehen kann. Aber glaub mir, es gibt weitaus schlechtere GUI-Tools als GUIDE Smile

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 05.08.2008, 09:11     Titel:
  Antworten mit Zitat      
Moin,

ich hab mir jetzt nicht alles durchgelesen, aber alternativ könntest du auch über (temporäre) externe Zwischenspeicher nachdenken --> mat-files

Wenn nichts von den anderen Vorschlägen hier funktioniert, dann erstell doch einfach in dem einen m-file ein mat-file, welches dann von der GUI geladen wird und "ausgewertet" wird...

Ein Beispiel findest du in der Scripte-Ecke: http://www.gomatlab.de/gui-werte-sp.....erfuegbar-mach-t2000.html

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gorbi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2008, 09:05     Titel: Danke, funktioniert!
  Antworten mit Zitat      
Hallo, Alex,

vielen Dank für den Hinweis. Ich habe es so gemacht, und es funktioniert!
Prima Sache, das mit dem "load" und "save". Very Happy

Beste Grüße
Gorbi
 
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.