Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何让脚本为输入提示提供值?_Matlab - Fatal编程技术网

Matlab 如何让脚本为输入提示提供值?

Matlab 如何让脚本为输入提示提供值?,matlab,Matlab,我有一组较小的脚本foo1,foo2,等等,还有一个脚本master.m,可以运行它们,如下所示: % master.m run foo1 run foo2 让我们假设foo1通过说a=input('gimmeanumber\n')在某处调用输入 我认为,如果我在run命令后将所需的值放在新行上,它们将作为输入输入,但它们不是。我还尝试将它们作为字符串封装,即'5'。那也不行 它们是我应该使用的另一个功能吗?我查看了输入的帮助文件,但没有输出功能。大概在某个地方有类似于write或writ

我有一组较小的脚本
foo1
foo2
,等等,还有一个脚本
master.m
,可以运行它们,如下所示:

% master.m

run foo1

run foo2
让我们假设
foo1
通过说
a=input('gimmeanumber\n')在某处调用输入

我认为,如果我在
run
命令后将所需的值放在新行上,它们将作为输入输入,但它们不是。我还尝试将它们作为字符串封装,即
'5'
。那也不行

它们是我应该使用的另一个功能吗?我查看了
输入
的帮助文件,但没有
输出
功能。大概在某个地方有类似于
write
writetostdio
的东西

如何在不触碰键盘的情况下为另一个脚本调用的脚本提供用户输入?我可以将要输入的值放入
master.m
文件中吗

编辑: 因为有点混乱,我会尽力澄清的

脚本
foo1
foo2
不会来回传递值。每个脚本都将独立运行。相反,我试图测试一个程序的一系列用户行为(即通过
foo1
中的
input
对提示的响应)。这些通常是在键盘上键入的,但我希望我的
master.m
文件告诉
foo1
用户输入的内容


很抱歉,这让人困惑,但希望这能澄清问题。

好的,这有点难看。。。但是如果出于某种原因,
foo1.m
等必须保留为脚本,那么这可能是一个解决办法

想法是用新定义的函数
myInput
替换
input
的每个实例,该函数检查是否在基本工作空间中设置了变量
PROMPT\u值
;如果是,则返回,否则传递到内置的
输入。例如:

% 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
假设我们有以下子脚本:

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

% foo2.m
b = myInput('Number to halve: ');
disp(b/2);
我们可以按如下方式测试该方法:

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

PROMPT_VALUE=3;
run foo2.m

如果按原样运行,则会将提示_值作为每个下标的输入(返回10和1.5)。如果这些行被注释掉,它将查找来自用户的输入。

修改现有代码以适应手动输入和测试输入是微不足道的:

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!


这比尝试从文本文件中导入内容、使用
evalin
将内容导入工作区,或者以这种方式使用脚本所需的任何自动方法更符合逻辑。

使用。函数定义了输入和输出,这是它们的目的。脚本不会。懒惰不是寻找糟糕编程解决方案的借口。这是在要求一个糟糕的编程解决方案。使用函数并不禁止运行一件事,并在早上回来查看结果。将脚本转换为函数在这里没有意义。他想运行一个测试脚本,该脚本运行另一个请求用户输入的脚本。在生产中,脚本总是要求输入来自键盘,因此将其作为接受参数的函数是没有意义的。然而,出于测试目的,他希望自动运行它,提供输入,这样他就可以测试一组输入值。因此,再次强调,将脚本转换为函数的建议没有意义。@SembeiNorimaki您从该前提得出的结论是荒谬的。一个定义良好的函数从包装器中获取输入,提示用户输入,这比任何试图通过管道传递值的笨拙解决方案更有意义,因为这也适应了批处理/自动调用。他想从一个脚本中获取输出,并将其用作另一个脚本的输入。在
foo1
没有输入的情况下,您不能从
master
提供输入,因为从
master
提供值是输入的全部要点。这是一种变通方法,但在任何情况下都不是一种有用的变通方法。有用的解决办法是以不同的方式来做。@Sembei请记住,SO不仅仅是为了帮助特定的询问者,它还意味着作为编程的知识库。有人可能会认为,从长远来看,停止传播有害的编程做法对公众更有帮助。通常,“我如何做愚蠢的事情Y来解X?”的正确答案是“做不愚蠢的事情Z”。同意,更多的是使用语气。如果有人问了一个完全正确的问题,回答是:“你很懒,你的编程风格很烂,这是我的聪明答案”,那么OP可能不会学到很多东西,也不会再问了。
>> 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!