forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   if break=2012 then ... (http://forum.boolean.name/showthread.php?t=13269)

Ksanatos 01.09.2010 14:31

if break=2012 then ...
 
Вопрос собственно не затейлевый.
  1. Что может прирвать оператор break?
    1. Может ли он прекратить выполнение подпрограммы и перейти в место её вызова?
      1. Если нет, то как это сделать?

ViNT 01.09.2010 15:37

Ответ: if break=2012 then ...
 
break - это безусловный выход из цикла (любого).
PHP код:

while true do //Бесконечный цикл
 
begin
  I
:=I+1;
  if 
I>100 then 
   
break;//Выход из цикла
 
end

Поскольку в MP нет так всеми нелюбимого GOTO, и Exit тоже нет, придется для возврата на точку входа делать что-то в роде:

PHP код:

var
 
Flag:Boolean;// Флаг возврата

procedure proc1;
begin
 
....
 
Flag:=False;//По умолчанию предполагаем, что нужно будет вернуться
 
if not(I<10then //Под NOT - условие, при котором нужно выйти
 
begin 
 
// Код процедуры после точки возврата
 
Flag:=True;//Если мы попали сюда, значит условие возврата не отработало, отменяем возврат
 
end;
end;

//В основном коде
...

while 
not flag do proc1// Крутимся, пока флаг возврата не равен true 

Изврат, конечно, но других вариантов вроде бы нет.


Мне в одном проекте из-за отсутствия goto и exit пришлось навертеть такую рекурсию на переходах по меню, что если долго лазить по меню, можно запросто словить переполнение стека. А по другому никак.

Ksanatos 01.09.2010 21:19

Ответ: if break=2012 then ...
 
Спасибо.
Всегда смотрю на твою подпись с горечью. Каждый раз, когда начинаешь новый проект с такими широкими планами и задумками, все мечты рушаться от первого взгляда на шаблон:
program NewProject;
begin

end;

ffinder 01.09.2010 22:36

Ответ: if break=2012 then ...
 
Цитата:

Сообщение от ViNT (Сообщение 160622)

Мне в одном проекте из-за отсутствия goto и exit пришлось навертеть такую рекурсию на переходах по меню, что если долго лазить по меню, можно запросто словить переполнение стека. А по другому никак.

стрелять-колотить, открой же для себя конечные автоматы, стек состояний и прекрати такое писать в общественных местах.
фейспалм.jpg

ViNT 01.09.2010 22:54

Ответ: if break=2012 then ...
 
Цитата:

Сообщение от ffinder (Сообщение 160665)
стрелять-колотить, открой же для себя конечные автоматы, стек состояний и прекрати такое писать в общественных местах.
фейспалм.jpg


Более-менее знаком с конечными автоматами, но не очень представляю, как его туда прикрутить. К тому же, когда писал сбжевую программу, о конечных автоматах еще знал только понаслышке. На счет стека состояний - сознаюсь, не сталкивался. Возможно, его реализация на MP будет не так тривиальна, как в других языках.

Ksanatos 21.09.2010 19:15

Ответ: if break=2012 then ...
 
если чесно википедия и др. источники маво небольшого знания не помогли мне понять что есть автоматное программирование и стек состояний.
Но я сам реализовал по другому:
в некой переменной(what_i_must_do хи-хи) храним значение следующем запускаемой программы.
При запуске(да кому где угодно) мидлета запускаем процу(в отделльном модуле). В которой в соответствии со значением what_i_must_do запускается та или иная процедура.
Во время исполнения what_i_must_do присваивается новое значение, возвращаемся в "запускательную" процу с новым значением. Естественно "запускательная" проца с бесконечным циклом.
Но есть проблема: Надо зделать так чтобы what_i_must_do не менялась до конца переменной. Т.к. Это поможет только в определённых случаях, например походам по меню)


Часовой пояс GMT +4, время: 05:29.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot