Вообще нормально ли зацикливаться, если операторы с goto под else? - PullRequest
2 голосов
/ 14 июня 2019

Итак, у меня есть задача, которая заключается в том, чтобы запрограммировать робота (AUBO), чтобы он выбирал разные объекты и располагал их в определенном порядке (точки A, B, C, D).Я использую некоторую систему зрения, известную как pim60.Поэтому, если объект обнаружен, он пойдет и выберет, а остальная часть программы будет путеводной точкой для отбрасывания продуктов.Первая проблема заключается в том, что я хочу, чтобы она переместилась на следующую путевую точку для удаления, а во-вторых, следующая точка отбрасывания не может быть пропущена, пока не будет обнаружен объект для этой точки отбрасывания.

В своем собственном коде я написал довольно длинную программу, подобную этой.

::LoopA::
script_common_interface("SICKCamera","takePhoto")
script_common_interface("SICKCamera","getResult")
Located = script_common_interface("SICKCamera","partLocated")
if(Located == 1) then
.
.
.
Drop at position A
else 
goto LoopA
end

::LoopB::
script_common_interface("SICKCamera","takePhoto")
script_common_interface("SICKCamera","getResult")
Located = script_common_interface("SICKCamera","partLocated")
if(Located == 1) then
.
.
.
Drop at position B
else 
goto LoopB
end

::LoopC::
script_common_interface("SICKCamera","takePhoto")
script_common_interface("SICKCamera","getResult")
Located = script_common_interface("SICKCamera","partLocated")
if(Located == 1) then
.
.
.
Drop at position C
else 
goto LoopC
end

::LoopD::
script_common_interface("SICKCamera","takePhoto")
script_common_interface("SICKCamera","getResult")
Located = script_common_interface("SICKCamera","partLocated")
if(Located == 1) then
.
.
.
Drop at position D
else 
goto LoopD
end

Нет ошибки, и программа работает, как и ожидалось.Однако мне интересно, есть ли лучший способ сделать это.

1 Ответ

1 голос
/ 14 июня 2019

Единственным общепринятым вариантом использования goto является обработка ошибок, например чтобы перейти к коду очистки. Но даже для этого обычно можно и нужно избегать.

Вы, вероятно, можете сделать что-то вроде этого:

-- loop B
repeat
  take photo, etc.
  located = ...
until(located == 1)

Drop at position B

Кроме того, если вы повторяете один и тот же код три раза, вы должны извлечь его в функцию и, возможно, указать позицию в качестве параметра. Или, по крайней мере, поместите все это в цикл for.

...