Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Как избавиться от goto?   Найти похожие ветки 

 
kull ©   (2004-05-07 14:02) [0]

Есть код, в котором присутствует куча меток и операторов goto.
Аж волосы дыбом встают, и не только на голове. :)

Ну типа:
if ... then goto m1
else ...;

if ... then goto m2
else m3;

m1:
 ...
 if ... goto m3;
m2
 ...
 if ... goto m1;
m3
...

Задача: Перевести этот код в приличный вид, соответствующий принципам структурного программирования.

Какие будут предложения? Может кто-то знает хороший способ?


 
Digitman ©   (2004-05-07 14:05) [1]

я знаю.
"реинжениринг" этот способ называется  .. aka "переписать фсе нафих"


 
Locker   (2004-05-07 14:06) [2]

if ... then
begin
 // код под goto m1
end
else ...;


 
Романов Р.В. ©   (2004-05-07 14:06) [3]

if not(...) then {вместо goto m1}begin
{вместо m1:}end;


 
Gero ©   (2004-05-07 14:06) [4]


> Digitman ©   (07.05.04 14:05)

Поддерживаю.


 
Игорь Шевченко ©   (2004-05-07 14:06) [5]


> Может кто-то знает хороший способ?


Написать алгоритм кода, воспроизвести это алгоритм "в приличном виде, соответствующем принципам структурного программирования."

А как еще ?


 
kull ©   (2004-05-07 14:48) [6]

Да, первое желание конечно - "переписать фсе нафих" и у меня возникло.
Но переписывать "нафиг" процедуру из 2000!!! строк (я такое первый раз видел, просто опупел, и это не самая большая. Как этот код умудряются поддерживать?) - задача не из простых...

Ох и повезло же мне :(


 
Romkin ©   (2004-05-07 15:59) [7]

Выдели все помеченные разделы в отдельные процедуры, и подставляй их вызов вместо goto... Правда, помаяться с параметрами придется


 
WebErr ©   (2004-05-07 16:18) [8]


> kull ©   (07.05.04 14:48) [6]

Кто Вас так осчастливил? :)


 
Nikolay M. ©   (2004-05-07 16:39) [9]


> Romkin ©   (07.05.04 15:59) [7]
> Выдели все помеченные разделы в отдельные процедуры, и подставляй
> их вызов вместо goto... Правда, помаяться с параметрами
> придется

С языка снял :)
А с параметрами можно и не мучиться, если процедуры делать внутри основной процедуры.
Конечно, получится тот же код, только в профиль, но хотя бы goto глаза резать не будет :)


 
kull ©   (2004-05-07 16:59) [10]

Ой!
Я такое нашел !!!

goto NextLabel;

while Result <> SUCCESS do
begin

NextLabel:

end;

В справку по goto конечно здесь не заглядывали...


 
kull ©   (2004-05-07 17:03) [11]


> WebErr ©   (07.05.04 16:18) [8]

Да есть добрые люди...

>Romkin ©
Насчет разбивки на отдельные процедуры я подумал, скорее всего я так и буду делать.

Правда есть тонкости когда несколько меток подряд идут:

m1
...
m2
...
m3
...

и попадаешь на них... вообщем откуда только не попадаешь..


 
TUser ©   (2004-05-07 17:07) [12]

Похоже писал этот код Настоящий Программист Мел. Теперь он уже признает компиляторы, но организовывать алгоритм правильно - это не для его крутых способностей. Уж лучше goto ^)

Ума не приложу - как он такое умудрился отладить, ведь это же ...а.


 
wicked ©   (2004-05-07 17:14) [13]

не знаю точно, чьё это, но припомнились фамилии Бом и Джакопини...
способ заключается в том, чтобы:
1. завести переменную состояния, значение которой будет обозначать переход на определенную метку...
2. организовать "адын балшой" case, вариантами которого забить все, что лежит под данной меткой... переход - state := xx....
3. проанализировать и уменьшить кол-во вариантов case"а....

в общих чертах так... подробнее, вспоминается, было в статье "алгоритм преобразовывает алгоритм", поищи в инете....


 
Nikolay M. ©   (2004-05-07 17:15) [14]


> Правда есть тонкости когда несколько меток подряд идут:
>
> m1
> ...
> m2
> ...
> m3
> ...

Все, что между метками - в отдельную процедуру.


 
Romkin ©   (2004-05-07 17:26) [15]

kull ©  (07.05.04 17:03) [11] Начинаешь снизу, делаешь процедуру m3, потом m2, в конце которой вызов m3... :))
А может, подойдет, как советует wicked ©, что-то вроде конечного автомата, глянь:
http://rsdn.ru/article/alg/statemachine.xml


 
wicked ©   (2004-05-07 17:31) [16]

в догонку к вышесказанному...
первая ссылка, выданная яндексом на "алгоритм преобразовывает алгоритм" - http://www.citforum.ru/programming/digest/formal.shtml ....


 
kull ©   (2004-05-07 17:44) [17]


> wicked ©   (07.05.04 17:14) [13]

Похоже то, что надо.

Спасибо всем!
Спасибо за ссылочки, попробую поискать еще что-нибудь...


 
TransparentGhost   (2004-05-07 17:52) [18]

Mne tozhe odnazhdi poschastlivilos" prinjat" projekt ot "nastojashih programmerov" ( o sebe oni bili ooooochen" visokogo mnenija).
Chto-bi ponjat" chto ze u nih ponapisano v procedurah, ja raspechatival ih na besprerivnih listah ( kazhdaja procedura metra po 4 v srednem zanimala na bumage) i plzaja po polu s markerom videljal bloki.
potom optimiziroval eti proceduri.
v rezul"tate vsja programma vmesto iznachal"nih 65000 strok stala 15000 strok. i eto pri BUILD ALL.
tak cheto ne pozhalej usilij, perepishi po novoj. hot" budesh znat" gde chto.


 
Pat ©   (2004-05-07 20:07) [19]


goto NextLabel;

while Result <> SUCCESS do
begin

NextLabel:

end;


Хе...вот точно такое же у нас в универе писали...правда на асме, но смысл был такой - из различных мест могли делать как переход на метку, так и вызов процедуры. Правда это была лабораторка, а не реальная задача. Препод оставил сие творение в "музее боевой славы"


 
Fay ©   (2004-05-08 08:32) [20]


> goto NextLabel;
>
> while Result <> SUCCESS do
> begin
>
> NextLabel:
>
> end;


Не думаю, что это полный текст. Или приведён не весь, или задумка была другой. Похожие вещи встречаются :

const
 BSZ = 4;
var
 hr, hw, nr, nw : DWORD;
 b : array[0..BSZ - 1] of Byte;
label
 Label1;
begin
 hr := CreateFile("c:\boot.ini", GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
 hw := CreateFile("c:\boot.fuck", GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
 goto Label1;
 repeat
   WriteFile(hw, b, nr, nw, nil);
   Label1 :
   ReadFile(hr, b, BSZ, nr, nil);
 until nr = 0;
 CloseHandle(hr);
 CloseHandle(hw);



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
8-1078160093
__Alex__
2004-03-01 19:54
2004.05.23
Компонент для загрузки AVI из потока


3-1083159389
pashaz
2004-04-28 17:36
2004.05.23
multiselect в Grid e


1-1083765374
rWizard
2004-05-05 17:56
2004.05.23
Создание директории (папки)


1-1083748083
ASMiD
2004-05-05 13:08
2004.05.23
Определение цвета прямоугольника


3-1083320576
Однако
2004-04-30 14:22
2004.05.23
про RzDBLookupComboBox, модальное окно и кнопку Cansel