我怎么能让这个程序更优雅?

时间:2011-02-22 23:02:28

标签: tcl

我有一个伺服控制器正在移动物体越来越接近传感器,试图触发它。

我希望开始的距离为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]
}

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]
}