Der Schlüssel ist eine sinnvolle und brauchbare Schnittstelle der Funktionen.
Nachfolgend deshalb die Vorschläge für die beiden Funktionsköpfe. Die Funktionsnamen (trEPRTSim_cli_sim
und trEPRTSim_cli_fit
) sind vorläufig und sollen keine Vorentscheidung darstellen.
function varargout = trEPRTSim_cli_sim(varargin) % TREPRTSIM_CLI_SIM Subfunction of the trEPRTSim CLI handling the simulation part. % % Usage % trEPRTsim_cli_sim % trEPRTSim_cli_sim(dataset) % dataset = trEPRTSim_cli_sim % dataset = trEPRTSim_cli_sim(dataset) % [dataset,<command>] = trEPRTSim_cli_sim(dataset,<command>) % % dataset - struct % Full trEPR toolbox dataset including TSim structure % % command - string % Additional information what to do (bypassing certain loops)
Ideen zur Schnittstelle:
command
erlaubt die Übertragung zusätzlicher Informationen zum Ablauf in beide Richtungen.Der Aufruf in der Hauptschleife, die zwischen Fit und Simulation unterscheidet, sieht vermutlich wie folgt aus:
% ... % Chose wether it shall be simulated or fitted answer = cliMenu({'f','Fit';'s','Simulate';'q','Quit'},'default','f','title',... 'Do you wish to simulate or to fit?'); switch answer case 'f' trEPRTSim_cli_fit(); case 's' trEPRTSim_cli_sim(); case 'q' disp('Goodbye!'); return; otherwise % Shall never happen action = ''; end
Alternativ (vielleicht sinnvoller) könnte das auch innerhalb der outerloop
stattfinden:
outerloop = true; while outerloop switch lower(action) case {'fit','f'} [dataset,command] = trEPRTSim_cli_fit(); if strcmpi(command,'exit') outerloop = false; end case {'sim','s'} [dataset,command] = trEPRTSim_cli_sim(); if strcmpi(command,'exit') outerloop = false; end end end
Wenn die Funktionen sich untereinander selbst aufrufen, eben gerade um vom Fit zur Simulation und zurück zu wechseln, ist es wichtig, sie mit den Rückgabeparametern aufzurufen:
[dataset,command] = trEPRTSim_cli_sim();
bzw.
[dataset,command] = trEPRTSim_cli_sim(dataset);
Da es jetzt vermutlich aufgrund der Schachtelung nicht mehr einfach möglich ist, die Funktion zu beenden – return
wird vermutlich nur bis zur aufrufenden Funktion zurückgehen –, müßte im Falle, daß man enden möchte, als Rückgabewert für „command“ sowas wie „exit“ übergeben werden. Das könnte dann wie folgt abgefragt werden:
[dataset,command] = trEPRTSim_cli_sim(); if strcmpi(command,'exit') return; end
Bislang erzeugen sowohl die Fit- als auch die Simulationsschleife jeweils einen leeren Datensatz. Im Fit wird dieser dann weitestgehend mit den Daten aus dem geladenen experimentellen Datensatz gefüllt.
Wenn man den zu schreibenden eigenen Funktionen jeweils optional einen Datensatz übergeben kann, muß das natürlich abgefragt werden. Das könnte ungefähr so aussehen:
if nargin % If we have input arguments if isstruct(varargin{1}) dataset = varargin{1}; end else % Create (empty) dataset % TODO: Handle missing parameters, such as field range, ... dataset = trEPRTSim_dataset(); % Initialize minimal simulation parameters dataset = trEPRTSim_simini(dataset); end