Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

GoTo   Найти похожие ветки 

 
WestBronx   (2006-02-18 11:35) [0]

Привет. Подскажите, есть ли в делфи нечто подобное:

if i := 1 then  goto endp;
...
endp:


Извените за прямо сказать тупой вопрос, просто по F1, искал, нашёл кое что но непонял как этим пользоваться, объясните пожалуйсто. спасибо.


 
ЮЮ ©   (2006-02-18 11:51) [1]

если endp: - метка выхода из процедуры, то

try
 ...
      if i = 1 then Exit;
 ...
finally
  // этот код выполнится всегда, даже по Exit из любого места процедуры
end;


 
Гаврила ©   (2006-02-18 13:18) [2]

Использование Goto категорически не рекомендуется, так как концептуально неверно.
Если все таки приперло попользовать, синтаксически эта возможность есть (она осталась еще со времен старого доброго паскаля)

procedure TForm1.Button1Click(Sender: TObject);
label m1, m2;

begin
 if Sender is TButton
   then goto m1
   else goto m2;

 m1:
  begin
    ShowMessage("m1");
    Exit;
  end;
 m2: ShowMessage("m2");

end;


 
WestBronx   (2006-02-18 14:17) [3]

Спасибо огромное. Разобрался =)

"Использование Goto категорически не рекомендуется, так как концептуально неверно."
А по подробнее где прочитать можно? Или расскажете что там критичного?


 
DrPass ©   (2006-02-18 14:44) [4]


> А по подробнее где прочитать можно? Или расскажете что там
> критичного?

Любой приличный учебник по программированию за последние 15 лет. Критичного - ничего. Кроме одного: если разбираться в коде сложной программы, где используются goto, можно свихнуть мозги. А это уже решающий фактор чтобы от него отказаться. Тем более что нет такой ситуации, где бы нельзя было без него обойтись


 
McSimm ©   (2006-02-18 14:47) [5]

Мини-статья о пользе околорелигиозных мотивов :)

Сам по себе Goto безусловно не является каким-то корнем зла или причиной неправильной работы программы.
Виновата, на мой взгляд, его "безапеляционность", совершенно не приспособленное поведение под структурность кода, точнее под хорошую структурность кода.

Использование goto вполне может быть безвредным, (если не считать то, что показать такой код кому-то вы не сможете :)

Использование goto на начальных этапах программирования порой напрашивается как самый простой вариант построения той или иной конструкции, чтобы перестроить код на "правильную" структуру требуется дополнительная умственная работа. Если вам не помешать и не заставить это сделать, в ваш код почти наверняка начнут вплетаться goto как сорняки.
В результате вы получаете работающий правильно код, который напоминает тарелку со спагетти :) (сравнение не мое, но источник уже не вспомню)

Через некоторое время вы начнете получать уже якобы работающий код, с заложенными в него логическими дырами, а потом вам придется или плюнуть на усложнившуюся задачу или провести полный рефакторинг.

Понять, осознать это можно только получив достаточный опыт. Но на этом этапе новичок обычно стоит на позиции "зачем мне извращаться и усложнять структуру если вполне работающий и отнюдь нисколько не запутанный код получается если вставить здесь goto"

И вот тут помогающим фактором выступает "религиозный" канон. Вам со всех сторон говорят, что goto это плохо. Покажи вы свою процедуру, первым замечанием какое вы получите?
Почему "религиозным" ? Потому что обычно никто не в состоянии (я в том числе) достаточно толково объяснить суть претензий :)

К слову сказать, операторы break continue exit и т.п. по сути являются такими же прерывателями логики, удаляющими код от идеальной структурной организации. Более того, к вредителям можно отнести даже технику флагов.
Тем не менее использование вышеупомянутых "сорняков" не является настолько нежелательным, как goto. Объяснить это я могу тем, что эти конструкции являются частью основных логических кирпичиков и разрушают структурность намного в меньшей мере.
Хотя отсутствие догматических "запретов" на них является причиной появления такого жуткого винегрета, который не всякому goto доступен :)


 
Галинка ©   (2006-02-18 15:26) [6]

А зачем нужна такая конструкция? Я обычно обходила это с помощью условных циклов repeat ... until, где в конечное условие было включено и это тоже. Самый простой вариант завести какой-то флаг или счетчик и проверять его. Но без предметной области точно сказать нельзя.


 
WestBronx   (2006-02-18 21:02) [7]

Галинка ©   (18.02.06 15:26) [6]
Мне нужно было в начале обработке процедуры, вставить проверку, если переменная i = 0, тогда пропускаем вычеслительные действия, и сразу к концу процедуры. Лучшей альтернативы, ежели GoTo, я не вижу.
P.S. Создать 2 процедуры, не выход %)

McSimm ©   (18.02.06 14:47) [5]
Спасибо, позновательно ;)

DrPass ©   (18.02.06 14:44) [4]
Единственный учебник который у меня есть по делфи, это справочник команд %) (нормального описания GoTo, там к сожалению не оказалось) Остальное как правило либо в интернете, либо в F1.


 
Чародей ©   (2006-02-18 21:35) [8]


> Мне нужно было в начале обработке процедуры, вставить проверку,
>  если переменная i = 0, тогда пропускаем вычеслительные
> действия, и сразу к концу процедуры. Лучшей альтернативы,
>  ежели GoTo, я не вижу.


procedure
begin
if i<>0 then
begin
...
end;
end;

Разве не вериант?


 
Галинка ©   (2006-02-18 22:31) [9]

Если эта переменная передается, то лучше ИМХО
wheil i<>0 do
begin
{  тело цикла  }
end


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


 
McSimm ©   (2006-02-18 23:29) [10]

>Галинка ©   (18.02.06 22:31) [9]
что вы называете безусловным циклом?


 
Fay ©   (2006-02-19 00:24) [11]

2 Гаврила ©   (18.02.06 13:18) [2]
> Использование Goto категорически не рекомендуется, так как концептуально неверно.

Бред.


 
Галинка ©   (2006-02-19 00:49) [12]

McSimm ©   (18.02.06 23:29) [10]

for ... to ... do ...

И это не я называю. Это я вычитала не то в Файсмане еще, не то в книжке Диалог МИФИ (авторов не помню)... Только не говорите, чтобы цитату привела. Нету у меня их сейчас уже...

Да и вот сейчас подумала, если все должно выполняться если i<>0, то так и надо написать. Вот как Чародей ©   (18.02.06 21:35) [8] рекомендует.


 
McSimm ©   (2006-02-19 01:06) [13]

>Галинка ©   (19.02.06 00:49) [12]
Я не придираюсь :), просто не совсем понял почему вы предложили использовать цикл и подумал что вы что-то напутали.
А почему for надо реже использовать ? Это некорректное утверждение.
Если количество итераций предопределено то именно его и надо использовать, в других случаях -- repeat/while


 
McSimm ©   (2006-02-19 01:08) [14]

>Fay ©
> Бред

Очень информативно, но недостаточно аргументировано :))
Возможно вы считаете использование goto оправданным, но не стоит наверное так с плеча рубить :)


 
Fay ©   (2006-02-19 02:54) [15]

2 McSimm ©   (19.02.06 1:08) [14]
Я решительно не вижу никаких аргументов против goto. Да и как поспоришь, когда тут все такие умные... "Хорошая структурность кода"... "прерыватели логики"... Ужоз!

"если разбираться в коде сложной программы, где используются goto, можно свихнуть мозги"
Можно подумать, без goto в сложной программе разбаться легко!

Короче, не надо путать вибратор в телефоне с телефоном в вибраторе. Всему своё время и место.


 
Германн ©   (2006-02-19 03:09) [16]

2 McSimm ©   (18.02.06 14:47) [5]
Извини, не согласен со многими положениями миги-статьи!


> К слову сказать, операторы break continue exit и т.п. по
> сути являются такими же прерывателями логики, удаляющими
> код от идеальной структурной организации.


 
Defunct ©   (2006-02-19 03:30) [17]

Fay ©   (19.02.06 02:54) [15]
Goto - это бесспорно хорошо для вот таких программ:

10. У попа была собака, он ее любил
20. она съела кусок мяса, он ее убил
30. goto 10.

и для вот таких:

maincycle:
  call proc1
  call proc2
  call proc3
  jmp maincycle

но его наличие обременяет как только goto начинает использоваться вот в таких программах:

start:
if a > 100 then goto checkcondition3
b := a / 2;
...
if cond1 then goto checkcondition3  
...
checkcondition2:
if cond2 then goto exit
a := b;
...
goto ainc1
...
checkcondition3:
if cond3 then goto checkcondition2
...
ainc1: a := a+1;
goto start
...
exit:

>> "если разбираться в коде сложной программы, где используются goto, можно свихнуть мозги"
> Можно подумать, без goto в сложной программе разбаться легко!

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


 
Галинка ©   (2006-02-19 03:43) [18]

А я думала goto умер вместе с Бэйсиком. Вот не поверите, я им точно в Паскале (лет этак 8 уже), никогда не применяла. Если честно, я даже не знала, что он в Паскале есть ... Спасибо что просветии. Нам как-то сказали, что применение этого оператора свидетельствует о "плохом стиле программирования". Да и если все можно процедурками, функциями и различными циклами оформить, то зачем он вообще?

В Бэйсике он был необходим по большей части для замены тех самых условных циклов. Т.е. если в Бэйсике была комбинация if... then goto..., то в Паскале я думаю можно обойти это с помощью условных циклов, ну искусственно завести счетчик или флажок (не так уж они и много весят), чтобы по этому условию until тоже выкидывал. Неужели это намного труднее чем goto end?


 
Fay ©   (2006-02-19 03:45) [19]

2 Defunct ©   (19.02.06 3:30) [17]
>10. У попа была собака, он ее любил
>20. она съела кусок мяса, он ее убил
> 30. goto 10.

Не только. Я использую для того, не писать совершенно одинаковые строки. Пример (T-SQL):

declare cursor ....
open cursor ...
goto some_label
while @@fetch_status = 0 begin
 ....
 :some_label
 fetch next ...
end
close c


В Delphi такие ситуации возникают реже, но возникают. Так почему бы не использовать goto? IMHO, подобный код весьма прозрачен.


 
Fay ©   (2006-02-19 03:48) [20]

8) чё-то я переволновался 8)
:some_label следует читать как some_label:


 
GoTo   (2006-02-19 04:23) [21]

Удалено модератором
Примечание: п. 5


 
Defunct ©   (2006-02-19 04:31) [22]

Fay ©   (19.02.06 03:45) [19]
> подобный код весьма прозрачен.

кому как, вам - как автору кода - да.
мне - нет, без коментариев и трассировки наврятли бы разобрался с какой целью был прыжек в тело цикла, минуя предусловие... А не зная особенностей T-SQL можно вообще впасть в панику, будет ли исполняться цикл или после "fetch next" или перейдет сразу к "close c".


 
Defunct ©   (2006-02-19 04:35) [23]

> Сделайте короче и понятнее без goto.

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


 
Рационализатор   (2006-02-19 04:39) [24]

Удалено модератором
Примечание: п. 5


 
Шутнык   (2006-02-19 04:43) [25]

Удалено модератором
Примечание: п. 5


 
Defunct ©   (2006-02-19 04:47) [26]

Рационализатор   (19.02.06 04:39) [24]

Правильно! ибо нефиг! ;>

Шутнык   (19.02.06 04:43) [25]
насчет [23] - это не шутка.


 
Шутнык   (2006-02-19 04:56) [27]

Удалено модератором
Примечание: п. 5


 
Defunct ©   (2006-02-19 05:10) [28]

> Ты не можешь ЗНАЧИТЕЛЬНО ускорить программу даже если этот код будет выполняться мгновенно.

Да.. наверное в вашей программе еще много подобных мест, поэтому признаю что погорячился. Значительно ускорится только алгоритм отвечающий за "появление" и "исчезновение" enemies.

И вопрос был не как от этого кода избавитсья, а как сделать ЭТОТ код короче или понятнее
Да мне все-равно о чем был вопрос. Зато я точно знаю, что именно этот код можно за команию с goto убрать и вместо него написать более быстрый аналог без ущерба в быстродейтвии и наглядности.


 
Fay ©   (2006-02-19 05:16) [29]

2 Defunct ©   (19.02.06 4:31) [22]
> не зная особенностей T-SQL можно вообще впасть в панику
Думаю, правильнее было бы сказать "совсем/почти не зная T-SQL". На таком уровне рано ещё читать чужие исходники - нужно буквари/BOL изучать.


 
Шутнык   (2006-02-19 05:16) [30]

Удалено модератором
Примечание: п. 5


 
Defunct ©   (2006-02-19 05:27) [31]

Шутнык   (19.02.06 05:16) [30]

Дите 3 лет..
вместо вполне логичного и ожидаемого мной от вас вопроса "как это сделать?", начались какие-то "обидки-кровавки", домыслы и т.п.
Смысл-то защищать один из многих возможных, но далеко не лучший алгоритм?


 
Шутнык   (2006-02-19 05:37) [32]

Удалено модератором
Примечание: п. 5


 
Defunct ©   (2006-02-19 05:40) [33]

Шутнык   (19.02.06 05:37) [32]

LOL
извините не сдержался.
В общем, что тут сказать "юзаете" goto - "юзайте" дальше.


 
Fay ©   (2006-02-19 05:42) [34]

2 Defunct ©   (19.02.06 5:40) [33]
Вы м.б. ещё не догадались, но мы ждём от Вас то самое шустрое и изящное решение [21].


 
Шутнык   (2006-02-19 05:44) [35]

Удалено модератором
Примечание: п. 5


 
Defunct ©   (2006-02-19 05:45) [36]

Fay ©   (19.02.06 05:42) [34]

Дык -
вариант 1:  добавить динамический список, куда помещать записи с номерами освободившихся ячеек массива. Тогда и по массиву "пробегаться" не придется и goto не нужен.


 
Fay ©   (2006-02-19 05:47) [37]

На самом деле, нужно просто не создавать дырки 8)


 
Defunct ©   (2006-02-19 05:49) [38]

Fay ©   (19.02.06 05:47) [37]

это уже вариант 2.
в запасе есть еще пару вариантов ;>


 
Шутнык   (2006-02-19 05:54) [39]

Удалено модератором
Примечание: п. 5


 
Джо ©   (2006-02-19 05:55) [40]

Удалено модератором



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

Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.014 c
2-1141118135
AlexeyT
2006-02-28 12:15
2006.03.19
Как закрыть форму из OnShow


3-1138456107
midavik
2006-01-28 16:48
2006.03.19
не работает Linked Servers из Делфи


15-1140954049
постигаю
2006-02-26 14:40
2006.03.19
меняющаяся ячейка


1-1140023237
parovoZZ
2006-02-15 20:07
2006.03.19
TTreeView и ComboBox


6-1133119368
asd
2005-11-27 22:22
2006.03.19
Edit и web страничка?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский