2016-09-02 24 views
-2

私はこのような小さなスクリプトfoo1の収集、foo2など、それらすべてを実行するスクリプトmaster.m、持っている:入力プロンプトに値を与えるスクリプトを取得するにはどうすればよいですか?

% master.m 

run foo1 

run foo2 

はのは、どこかa = input('Gimme a number\n');を言うことによって、入力用foo1通話をしましょう。

runコマンドの後に新しい行に必要な値を入力すると、入力として入力されるが、そうではないと思った。また、文字列として囲むことを試みました。つまり、'5'です。それはどちらもうまくいかない。

私はそれらの別の機能を使用すべきですか? inputのヘルプファイルを見ましたが、outputという機能はありません。恐らく、writeまたはwritetostdioのようなものがあります。

キーボードに触れずに別のスクリプトから呼び出されているスクリプトにユーザー入力を与えるにはどうすればよいですか? master.mファイルに入力したい値を入力できますか?

編集: 混乱があるので、私はそれをクリアしようとします。

スクリプトfoo1foo2は、前後に値を渡すことはありません。すべてのスクリプトはそれぞれrunになります。代わりに、私はのプログラムを、さまざまなユーザーの行動(のプロンプトに対する応答はfoo1)でテストしようとしています。これらは通常キーボードで入力されますが、master.mファイルにfoo1と入力してください。

申し訳ありませんが、これは混乱していますが、うまくいけばそれをクリアします。

+0

[関数](http://www.mathworks.com/help/matlab/ref/function.html)を使用してください。 – excaza

+0

各スクリプトは、すでに他の機能を呼び出すプログラム全体です。技術的にすべてを機能に変更することは可能ですが、それは非常に「良い」解決策ではありません(時間がかかり、以前の全プログラムが機能していることを意味します。 ..)。マスタースクリプトのアイデアは、私がそれを実行して、朝に戻って結果を見ることができるということです。 – jamesh625

+5

関数は入力と出力を定義していますが、その目的があります。スクリプトはそうではありません。怠惰はプログラミングの貧弱な解決策を探す言い訳ではありません。これはプログラミングの貧弱な解決策を求めています。関数を使用しても、1つのことを実行して、結果を見るために朝に戻ってくることを禁じるものではありません。 – excaza

答えて

0

これはちょっと醜いです...何らかの理由でfoo1.mなどがスクリプトとして残っていなければならない場合があります。

inputの各インスタンスを新しく定義された関数myInputに置き換えて、変数PROMPT_VALUEが基本作業領域に設定されているかどうかを確認します。その場合はそれを返し、そうでなければ組み込みのinputに渡します。たとえば、次のように私たちは、アプローチをテストすることができます

% foo1.m 
a = myInput('Number to double: '); 
disp(2*a); 

% foo2.m 
b = myInput('Number to halve: '); 
disp(b/2); 

:私たちは以下のサブスクリプトを持っていると仮定すると

% myInput.m 
function [ valueOut ] = myInput(promptString) 

    W = evalin('caller','whos'); %or 'base' 
    doesPVexist = ismember('PROMPT_VALUE',[W(:).name]); 

    if doesPVexist 
     valueOut = evalin('caller', 'PROMPT_VALUE'); 
    else 
     valueOut = input(promptString); 
    end 

end 

% master.m 
clearvars; 
PROMPT_VALUE=5; 
run foo1.m; 

PROMPT_VALUE=3; 
run foo2.m 

あなたは、これはそれが意志として-で実行する場合PROMPT_VALUEをそれぞれの添え字への入力として取る(10と1.5を返す)。これらの行がコメントアウトされている場合、ユーザーからの入力が検索されます。両方の手動入力とテスト入力に対応するために、既存のコードを変更する

+0

これは回避策ですが、決して役に立たない*回避策です。役に立つ解決策は、それを別の方法で行うことです。 –

+4

@SembeiはSOが特定の質問者を援助するためにここにあるだけでなく、プログラミングの知識ベースとして意味されることを覚えておいてください。長期的には有益なプログラミング慣行の普及を止めることは、より有益であると考えるかもしれません。 "* Xを解決するためにどうやって愚かなことをするのですか?"という答えはしばしば "*愚かではないものをZにする*" –

+1

これは合っています。誰かが完全に有効な質問をし、その応答が "あなたが怠け者でプログラミングスタイルが悪く、ここで私の知的回答がある"と答えた場合、おそらくOPはあまり学習せず、再度質問しません。 –

3

は簡単です:

私たちが行うことができます。このアプローチを使用
function foo1(niterations) 
if nargin == 0 
    niterations = round(input('How many iterations? ')); 
end 

for ii = 1:numel(niterations) 
    % Run the thing 
    fprintf('Running some random program with %d iterations! Yay!\n', niterations(ii)); 
end 

end 

>> foo1 
How many iterations? 2 
Running some random program with 2 iterations! Yay! 

または

>> foo1(2) 
Running some random program with 2 iterations! Yay! 

または

>> foo1([1, 3, 5, 7, 9]) 
Running some random program with 1 iterations! Yay! 
Running some random program with 3 iterations! Yay! 
Running some random program with 5 iterations! Yay! 
Running some random program with 7 iterations! Yay! 
Running some random program with 9 iterations! Yay! 

これは、テキストファイルからパイプすることよりもはるかに論理的です。つまり、evalinを使用して作業スペースに入り込ませたり、この方法でスクリプトを使用するのに必要な自動アプローチが必要です。

関連する問題