我有一个伺服控制器正在移动物体越来越接近传感器,试图触发它。
我希望开始的距离为15.5。但是,在每次迭代中,我希望它减小距离.1,直到传感器触发。为方便起见,我想退出while循环,并将变量$ currentHeight设置为此触发高度,因此我将减量行放在循环的beignning处。
但是,我必须在while循环之前对15.6起点进行硬编码,以便它在循环的第一行中递减到15.5。
这似乎并不优雅。关于如何修饰它的任何建议? 顺便说一句,对于你所有的老学校和晦涩的程序员来说,这是Tcl。 ;)
代码:
set currrentDistance 15.6
set sensorStatus 4
while {$sensorStatus == 1)} {
set currentDistance [expr $currentDistance - .1]
moveServo $currentHeight
set sensorStatus [watchSensor 2]
}
答案 0 :(得分:6)
我使用for
循环:
for {set d 155} {$d > 0} {incr d -1} {
set currentDistance [expr {$d * 0.1}]
moveServo $currentHeight
set sensorStatus [watchSensor 2]
# If we've found it, stop searching!
if {$sensorStatus == 1} break
}
这具有以下优点:首先对物理不可能性进行限制(将机器人磨成碎片没有意义!)其次是用整数进行迭代。第二点至关重要:二进制浮点数是棘手的事情,特别是在迭代0.1时,Tcl(与许多其他语言一样)在内部使用IEEE浮点运算。避免这些问题的方法是用整数迭代并有一些代码转换成浮点(例如,除以10)。考虑以0.1为单位处理倒计时。 : - )
另一个较小的风格点。将{
括号}
括在圆形表达式中,因为它可以提高安全性和性能。 (性能提升是因为运行时知道它不能有奇怪的表达式片段,这也是不安全的。不是因为它依赖于伺服硬件而在这段代码中很关键,但这是一个好习惯。进入。)
答案 1 :(得分:1)
我不知道Tcl,但它看起来像这样:
set currrentDistance 15.5
set sensorStatus 4
while {true} {
moveServo $currentHeight
set sensorStatus [watchSensor 2]
if {$sensorStatus == 1} then {break};
set currentDistance [expr $currentDistance - .1]
}