Я работаю на языке, где нет goto
, jump
функция. Например, Matlab. Не могли бы вы помочь мне в том, как избежать его использования? Есть ли простой трюк, решающий мою проблему?Альтернативы команд goto и jump
ответ
Ну, в первую очередь, вы можете также задать вопрос без тег matlab, вы можете получить более качественные ответы. Это связано с тем, что этот вопрос является общим для почти всех современных языков.
Вместо goto
и jump
вы должны использовать либо условные, как if
, if-else
или петли, как while
, for
, в зависимости от того, что вы хотите достичь.
Отъезд GOTO still considered harmful?, Why is goto poor practise?.
Вы должны рассмотреть возможность использования break
и continue
Вместо:
for ...
...
if ...
goto nextstuff:
end
end
nextstuff:
Вы можете сделать:
for ...
...
if ...
break
end
end
И как @andrey сказал, вы часто можете заменить goto
на if-else
Вместо того чтобы делать:
if cond
goto label
end
...
foobar()
...
label:
foobar2()
вы можете сделать:
if ~cond
...
foobar()
...
end
foobar2()
При использовании Гото, чтобы вернуться, вы можете заменить его на некоторое время:
Вместо того чтобы делать:
redothat:
foobar()
...
if cond
goto redothat;
end
Вы можете сделать:
while cond
foobar()
...
end
Большое спасибо за ваш ответ, и я прошу прощения за неправильный тег. Моя проблема в том, что я хочу реализовать диаграмму состояний (решетчатое кодирование), и я должен вернитесь в мой код. Я не знаю, есть ли что-то очевидное, где я не вижу (вполне возможно), но я не могу найти решение. –
Вы должны более подробно описать вашу проблему, если хотите получить менее общий ответ ... – Oli
У меня есть последовательность из 100 случайных (двоичных) чисел. –
Как @Andrey упоминание вы можете использовать if
или if-else
заявление. Во многих случаях петли, такие как while
, for
- это индивидуальные замены на if-else
и goto
.
Вы также должны принять во внимание использование break
и continue
заявлений в качестве @Oli, упомянутых выше.
В некоторых редких случаях вы можете использовать исключение (я не знаю, поддерживает ли Matlab), чтобы «вернуться». Это несколько противоречиво, но, может быть, в вашем случае это подойдет.
redothat:
foobar()
...
А внутри Foobar() в каком-то месте у вас есть
if cond
goto redothat;
end
вы можете сделать:
while(true){
try {
foobar();
...
break;
}
catch(YourApplicationException e){
//do nothing, continiue looping
}
}
А внутри Foobar() в каком-то месте у вас есть
if cond
throw YourApplicationException();
end
Или вы можете сделать что-то вроде этого:
вы можете сделать:
boolean isOk = false;
while(! isOk){
try {
foobar();
...
isOk=true;
}
catch(YourApplicationException e){
//do nothing, continiue looping
}
}
Если нет 'goto' в MATLAB, то вы не должны иметь никаких проблем избежать его;) – Chris
возможного дубликата [Перейти в м-файле] (HTTP: // StackOverflow .com/questions/1082605/jump-in-m-file) – gnovice