2011-02-22 117 views
0

我有一個伺服控制器,它將一個物體越來越靠近傳感器,試圖觸發它。我怎樣才能讓這個程序更優雅?

我想要的距離爲開始在15.5。但是,在每次迭代中,我都希望它減小距離.1,直到傳感器觸發。爲了方便起見,我想退出while循環,將變量$ currentHeight設置爲該觸發高度,所以我將減量線放在循環的標點處。

但是,我必須在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] 
} 
+1

這將永遠不會進入循環,因爲sensorStatus!= 1開始 – 2011-02-23 00:34:12

+0

@glenn:除非它是鏈接到某些內存映射硬件的變量,或者它具有設置的跟蹤。那會很醜。 – 2011-02-23 08:49:29

+0

我不得不改變一些識別信息,它看起來像我結束了不正確的編輯。但基本前提適用。 :)假設它可以進入循環。 – eastydude5 2011-02-23 22:18:43

回答

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 
} 

這樣做的優點是首先對物理不可能性有限制(將機器人研磨成碎片沒有意義!)和secondl y用整數進行迭代。第二點至關重要:二進制浮點數是棘手的事情,特別是在迭代0.1時,Tcl(與許多其他語言一樣)在內部使用IEEE浮點運算。避免這些問題的方法是迭代整數,並有一些代碼轉換爲浮點數(例如,除以10)。考慮以0.1爲單位進行倒計時。 :-)

另一個較小的風格點。將{大括號}放在表達式中,因爲它可以提高安全性和性能。 (性能提升是因爲運行時知道它不能有奇怪的表達式碎片,這也是不安全的。不是因爲它依賴於伺服硬件,所以它在這個代碼中至關重要,但是這是個好習慣進入。)

+0

謝謝你的回答,Donal。 – eastydude5 2011-02-23 22:19:23

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] 
} 
相關問題