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

Вниз

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

 
Yegorchic ©   (2004-04-20 21:40) [0]

Здрасте все... Есть такой код:

implementation

{$R *.dfm}

label labelX;

procedure XXXXXXX;
...
goto labelX;
...
end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
labelX:
...
end;

end.

Что не так? Почему он пишет "Label "labelX" is not declared in current procedure"?

Может это и глупый вопрос (я не знаю), но дайте на него ответ.
Заренее спасибо.


 
Rouse_ ©   (2004-04-20 21:42) [1]

> Label "labelX" is not declared in current procedure
Переменная labelX не объявлена в текущей процедуре.
Что еще не понятно? Это ж тебе не Бэйсик.
И вообщето Goto и Label - моветон...


 
Mihey ©   (2004-04-20 22:44) [2]

Угу, label только в пределах блока (т.е. внутри процедуры, функции).


 
ASvencim ©   (2004-04-20 22:50) [3]

И вообще, приличные люди goto не используют (не пойму почему)


 
Dimaxx ©   (2004-04-20 23:12) [4]

Просто использование этого оператора не является правилом хорошего программера (где-то читал). Попробуй обойтись без него.


 
Gero ©   (2004-04-20 23:19) [5]


> не пойму почему

Потому, что Вы его должным образом и не использовали.
Помню, у меня когда-то очень давно довольно большая программа на Паскале.
Я тогда был совсем новичком в программировании, процедуры почти не использовал, а вместо них - goto.
Поначалу было ничего.
Но когда количество label"ов перевалило за 30...
И все они были сложно сплетены...
После этого я дал себе слово по мере возможности не использовать goto.
Что и делаю.


 
Игорь Шевченко ©   (2004-04-21 00:03) [6]


> После этого я дал себе слово по мере возможности не использовать
> goto.


Всякий овощ приносит пользу, будучи употребленным в надлежащее время надлежащим образом. В том числе и goto.


 
Курдль ©   (2004-04-21 00:16) [7]


> Всякий овощ приносит пользу, будучи употребленным в надлежащее
> время надлежащим образом. В том числе и goto.

Не согласен. Не для того тужился Никлаус Вирт над Паскалем, чтобы в нем Goto и Label пихали куда ни попадя! Если есть острая необходимость воспользоваться "машиноподобными кодами" - сделайте ассемблерную вставочку (это еще можно как-то объяснить погоней за производительностью). Но Паскаль тем и хорош, что заставляет соблюдать модульную строгость программы. Для этого масса возможностей - "операторные скобки" begin ... end, процедуры, функции...


 
Gero ©   (2004-04-21 00:22) [8]


Игорь Шевченко ©   (21.04.04 00:03)

Обратите внимание:

> После этого я дал себе слово по мере возможности не использовать
> goto


 
Алхимик ©   (2004-04-21 00:30) [9]

>[7] Курдль ©   (21.04.04 00:16)
procedure Test(Param1..ParamN : TMyType);
var
  i,j,k,m,... : integer;
begin
  <создание чего-то>
  for i := 1 to 1000000 do begin
     for j := 1 to 1000000 do begin
        for k := 1 to 1000000 do begin
           repeat
              <жуткие вычисления>
              if <лажа> then goto FINISH;
           until m = -1;    
        end;
     end;
  end;
  <вывод результатов жутких вычислений>
  FINISH:
  <уничтожение чего-то>  
end;


Удобнее с GOTO?


 
Курдль ©   (2004-04-21 00:33) [10]


> if <лажа> then goto FINISH;

if <лажа> then break;


> Удобнее с GOTO?

Нет! И еще мэтодически нэверно!


 
Anatoly Podgoretsky ©   (2004-04-21 00:33) [11]

ASvencim ©   (20.04.04 22:50) [3]
Потому что приличные люди.


 
Mihey ©   (2004-04-21 00:35) [12]

Goto lives and rules форева!!!!


 
Almaz ©   (2004-04-21 00:41) [13]


> Курдль ©   (21.04.04 00:33) [10]
>
> > if <лажа> then goto FINISH;
>
> if <лажа> then break;
>

А теперь задумайтесь, правомерна ли такая замена ;) А она не правомерна, т.к. break в данном случае прервет выполнение только цикла repeat ... until, а в исходном варианте с goto прерывается выполнение всех вложенных циклов. Альтернатива goto здесь - это использование механизма исключений, но я бы использовал именно goto - это один из немногих случаев, где эта конструкция оправдана.

Удачи.


 
Игорь Шевченко ©   (2004-04-21 00:44) [14]

[8] Gero ©   (21.04.04 00:22)

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

С уважением,


 
Курдль ©   (2004-04-21 00:46) [15]


> Almaz ©

Каюсь! :)


 
Verg ©   (2004-04-21 05:55) [16]

procedure Test(Param1..ParamN : TMyType);
var
 i,j,k,m,... : integer;
begin
 <создание чего-то>
 try
 for i := 1 to 1000000 do begin
    for j := 1 to 1000000 do begin
       for k := 1 to 1000000 do begin
          repeat
             <жуткие вычисления>
             if <лажа> then exit;//goto FINISH;
          until m = -1;    
       end;
    end;
 end;
 <вывод результатов жутких вычислений>
 finally
 //  FINISH:
 <уничтожение чего-то>  
 end;
end;


 
Gero ©   (2004-04-21 07:43) [17]


> Verg ©   (21.04.04 05:55)

procedure Test(Param1..ParamN : TMyType);
procedure ThreeForAndRepeat;
var
  i,j,k,m,... : integer;
 begin
   for i := 1 to 1000000 do begin
     for j := 1 to 1000000 do begin
       for k := 1 to 1000000 do begin
         repeat
            <жуткие вычисления>
            if <лажа> then exit; // no problem
         until m = -1;    
       end;
     end;
   end;
   <вывод результатов жутких вычислений>
 end;

begin
<создание чего-то>
try
  ThreeForAndRepeat;
finally
<уничтожение чего-то>  
end;
end;

Катит? ;)


 
Verg ©   (2004-04-21 07:49) [18]


> Gero ©   (21.04.04 07:43) [17]


Катит.

А в чем "изюм"?


 
Gero ©   (2004-04-21 07:53) [19]


> Verg ©   (21.04.04 07:49)

В вашем примере finally-то не выполнится.


 
Verg ©   (2004-04-21 07:54) [20]


> Gero ©   (21.04.04 07:53) [19]


Заблуждаешься.

try
finally
end;

- секция finally выполнится в любом случае. Каким бы способом блок try не покинули: continue, break, exit или исключение.


 
Gero ©   (2004-04-21 07:59) [21]


> Verg ©   (21.04.04 07:54)

Спасибо, не знал.


 
Gero ©   (2004-04-21 08:05) [22]


> Verg ©   (21.04.04 07:54)

То есть, если в блоке try я вызову Exit, то это будет выход только из try?


 
Verg ©   (2004-04-21 08:15) [23]


> Gero ©   (21.04.04 08:05) [22]
>
> > Verg ©   (21.04.04 07:54)
>
> То есть, если в блоке try я вызову Exit, то это будет выход
> только из try?


Почему же, и из процедуры тоже, но перед этим выполнится(нятся) все секции finally этого(их) try блока(ов).

procedure F1(Par, Par2 : boolen);
begin
 try
   if Par then exit;
 finally;
   ShowMessage("Выход 1");
   if Par2 then exit;
 end;
 ShowMessage("Выход 2");
end;


Поэкп. с этой ф-цией.


 
Gero ©   (2004-04-21 08:18) [24]

> Verg ©   (21.04.04 08:15)

Все, я Вас понял. Спасибо.


 
Verg ©   (2004-04-21 08:20) [25]

Ты там увидишь, что Exit из секции finally вообще делать нельзя (кстати, забыл еще там goto в секции try - тоже не даст сделать).
если par1 = true, то произойдет "Выход 1", но "Выход 2" выполнен не будет. Если Par1 = False, то будет и "Выход 1" и "Выход 2".


 
Verg ©   (2004-04-21 08:24) [26]

Вот для упражнений....
procedure F1(Par: boolean);
label l1;
begin
try
  if Par then exit;
//   goto l1; // Ошибка
finally;
  ShowMessage("Выход 1");
//   exit; // Ошибка
end;
l1:;
ShowMessage("Выход 2");
end;


 
vengo   (2004-04-21 10:33) [27]

implementation

{$R *.dfm}

label labelX;

procedure XXXXXXX;
...
goto labelX;  //здесь не работает
...
end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
labelX:
...
end;

begin
  ...............
  goto labelX;   //здесь goto работает
  ...............
labelX:
  ...............

end.


 
panov ©   (2004-04-21 10:38) [28]

бред, простите за выражение.


 
PVOzerski ©   (2004-04-21 11:26) [29]

IMHO, не надо превращать борьбу с goto в какой-то "религиозный" обряд. Ну, можно выскочить из цикла через сочетания exit и try. А зачем огород-то такой городить? И читаемости кода это не прибавит (а я вообще, например, только недавно узнал, что при выходе по exit всё равно отрабатывает секция finally), и "тормозов", связанных с включением кода, ответственного за обработку исключений, прибавит.


 
Андрей Сенченко ©   (2004-04-21 11:37) [30]

PVOzerski ©   (21.04.04 11:26) [29]

Ну откровенно говоря и само GOTO с читаемостью кода мало сочетается, а вот метод try - exit - finally хорош безусловно.
Лично я вываливался из вложенных циклов boolean-овым флагом и break-ами, что тоже не очень удобно.


 
Verg ©   (2004-04-21 12:01) [31]


> PVOzerski ©   (21.04.04 11:26) [29]


Зря ты думаешь, что это "обряд".
В том примере try finally и так было бы желательно поставить, так как есть <создаем чего-то> и <уничтожаем чего-то>. Так почему бы двух зайцев сразу не заколбасить? :)


 
Григорьев Антон   (2004-04-21 12:06) [32]

К сожалению, в Delphi очень не хватает оператора Exit а-ля Ада, в котором можно явно указать, из скольки вложенных циклов надо выйти.


 
KSergey ©   (2004-04-21 12:23) [33]

> Григорьев Антон   (21.04.04 12:06)

Есть! Завется GOTO ;)

Мне думается, что в Aду ввели этот Exit лишь бы не использовать goto. Чтобы потом можно было сказать "а у нас гото нет, мы - крутой язык". Т.к. по сути это все равно одно и тоже получается.


 
ZrenBy ©   (2004-04-21 12:29) [34]

Я как-то год-полтора назад одному противнику goto
предлагал переписать одну процедурку, использующую goto,
без использования оного.

Но при этом ставил два условия.

1. Не должно быть вызовов функций/процедур.
2. Не должно быть повторяющегося кода.

Противник goto тогда вызов не принял.


 
KSergey ©   (2004-04-21 12:53) [35]

> 1. Не должно быть вызовов функций/процедур.

Странноватое требование...
Т.е. условия таковы, чтобы этого в принципе нельзя было сделать??

Для меня апогеем, убедившим в том, что использовать goto - вполне легитимно, явился такой фрагмент кода в одном примере. Причем я приведу лишь макет, на нем-то все видно, а реальный код был куда больше, со вложенными циклами, весь этот макет не сразу проглядывался, а потому я долго (минут 20, может я тупой?) силился понять зафиг так было делать (пример будет на паскале):

repeat
 .......
 .......
 .......
 if ... then  continue;
 .......
 .......
until True;


Я долго не мог понять зачем было делать цикл, который никогда на второй проход не пойдет?? И только через какое-то время таки разглядел это if с continue. Да, goto здесь нет, но так ли уж его формальное отсутствие здесь выигрышно?


 
Verg ©   (2004-04-21 13:05) [36]


> Да, goto здесь нет, но так ли уж его формальное отсутствие
> здесь выигрышно?

repeat
 ........................
 ........................
 GetMem(...);
 try
   ........................
   ........................
   if ... then  continue;
   ........................
   ........................
 finally
   FreeMem(....)
 end;
 ........................
 ........................
until True;


 
Fay ©   (2004-04-21 13:13) [37]

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


 
WebErr ©   (2004-04-21 13:22) [38]

Должна быть в Делфи процедура неокального перехода по метке, так как в Borland C++ (ANSI standard) она есть! Просто эта тема непопулярна, поэтому ей редко уделяют внимание в книгах, так как всегда можно обойтись без goto тем более нелокального (не очевидный, но факт!).


 
Григорьев Антон   (2004-04-21 13:36) [39]


> KSergey ©   (21.04.04 12:23) [33]
> > Григорьев Антон   (21.04.04 12:06)
>
> Есть! Завется GOTO ;)
>
> Мне думается, что в Aду ввели этот Exit лишь бы не использовать
> goto. Чтобы потом можно было сказать "а у нас гото нет,
> мы - крутой язык". Т.к. по сути это все равно одно и тоже
> получается.


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


 
Андрей Сенченко ©   (2004-04-21 13:36) [40]

Verg ©   (21.04.04 13:05) [36]

В приведенном Вами коде ничто не мешает поставить условие
if false goto
вместо
continue
..
until true;

GetMem() - FreeMem реализуется и в этом случае без использования защищенных блоков.



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

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

Наверх




Память: 0.57 MB
Время: 0.034 c
1-1079840364
Alibaba
2004-03-21 06:39
2004.04.11
Назначаем процедуру


7-1075702265
Met
2004-02-02 09:11
2004.04.11
Игровые автоматы


4-1075492801
Xerx
2004-01-30 23:00
2004.04.11
системное меню


3-1078979869
Nax
2004-03-11 07:37
2004.04.11
Два вопроса по rxDBLookupCombo


14-1079698818
YurikGl
2004-03-19 15:20
2004.04.11
У меня частенько форум выдет следующее....