我有一个伺服控制器正在移动物体越来越接近传感器,试图触发它.
我希望距离从 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] }
Donal Fellow.. 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为单位处理倒计时.:-)
另一个较小的风格点.将{
括号括起来,}
因为它可以提高安全性和性能.(性能提升是因为运行时知道它不能有奇怪的表达式片段,这也是不安全的.不是因为它依赖于伺服硬件而在这段代码中很关键,但这是一个好习惯.进入.)
我用了一个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为单位处理倒计时.:-)
另一个较小的风格点.将{
括号括起来,}
因为它可以提高安全性和性能.(性能提升是因为运行时知道它不能有奇怪的表达式片段,这也是不安全的.不是因为它依赖于伺服硬件而在这段代码中很关键,但这是一个好习惯.进入.)