Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
4-1080566809
ipnet
2004-03-29 17:26
2004.05.23
Вывод через TextOut своим шрифтом


9-1072205907
SoS
2003-12-23 21:58
2004.05.23
в примерах делфиХ нашел пример, но там безконечная карта!! как...


6-1080949188
-M13-
2004-04-03 03:39
2004.05.23
VPN соединение


1-1083826800
xman
2004-05-06 11:00
2004.05.23
MEMO


14-1083161865
FlankerX
2004-04-28 18:17
2004.05.23
NET Framework





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский