Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизКак избавиться от 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.029 c