Octave脚本中input仅生效一次问题排查与解决
踩坑记录:MATLAB脚本名与变量名重名导致重复运行失效
最近在完成edX慕课的一项练习时,我写了第一个MATLAB脚本distance_traveled,功能很简单:请求用户输入速度和行驶时间,计算并显示行驶距离。
初始脚本代码
% distance_traveled asks the user for speed and time traveled. % It calculates and displays the distance from this. clear all; % 一开始以为是变量残留,加了这个但没用 speed = input(['Enter speed in m/s :']); time = input(['Enter time traveled in s :']); distance_traveled = speed * time; disp(['Traveling for ', num2str(time), 'seconds at a speed of ', num2str(speed), 'm/s results in ', num2str(distance_traveled), ' Meters travelled.'])
奇怪的运行现象
第一次运行脚本完全正常:
>> distance_traveled Enter speed in m/s :10 Enter time traveled in s :10 Traveling for 10seconds at a speed of 10m/s results in 100meters travelled.
但后续再运行脚本时,诡异的事情发生了——根本不会弹出输入提示,直接输出之前的计算结果:
>> distance_traveled distance_traveled = 100 >> distance_traveled distance_traveled = 100
排查与解决
我一开始以为是工作区的变量残留,就在脚本开头加了clear all;,但完全没用,只有在命令行手动执行clear all后,脚本才会恢复正常运行。
折腾了一会儿才发现问题所在:我的脚本名distance_traveled和脚本内部定义的变量名完全重名了!
MATLAB的查找优先级是:先找工作区里已存在的变量,再找同名的脚本/函数文件。第一次运行脚本后,工作区里创建了distance_traveled变量,之后再输入这个名称时,MATLAB直接调用变量而不是执行脚本,自然不会触发输入逻辑。
找到问题后,我把变量名改成了distance,修改后的脚本如下:
% distance_traveled asks the user for speed and time traveled. % It calculates and displays the distance from this. speed = input(['Enter speed in m/s :']); time = input(['Enter time traveled in s :']); distance = speed * time; disp(['Traveling for ', num2str(time), ' seconds at a speed of ', num2str(speed), ' m/s results in ', num2str(distance), ' meters travelled.'])
改完之后,每次运行脚本都会正常弹出输入提示,计算结果也能正确更新了。
内容的提问来源于stack exchange,提问作者Stephan Goldenberg
相关产品推荐
相关产品推荐

