Как я могу сделать эту процедуру более элегантной? - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть сервопривод, которым я управляю, который перемещает объект все ближе и ближе к датчику, пытаясь его активировать.

Я хочу расстояние до начала при 15,5.Однако на каждой итерации я хочу, чтобы он уменьшал расстояние .1 до срабатывания датчика.Для удобства я хотел бы выйти из цикла while с переменной $ currentHeight, установленной на эту высоту запуска, поэтому я поместил линию декремента в начало цикла.

Но япришлось жестко закодировать начальную точку 15,6 перед циклом while, чтобы в первой строке цикла она уменьшалась до 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 ]

6 голосов
/ 23 февраля 2011

Я бы использовал цикл 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 голос
/ 23 февраля 2011

Я не знаю 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]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...