Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2012, 12:04   #31
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,865
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Метки и GOTO могут стать кошмаром, если ими злоупотреблять. Но в то же время есть парочка ситуаций, где их применение легитимно. Ты уж извини, но любые аргументы "это не читаемо" тут высосаны из пальца. "Мне не нравится" - это нифига не аргумент.
В том и проблема, что грань трудно провести, а в итоге получаем то, что получаем. Еще раз обращу ваше внимание на эти два идентичных куска кода, один из которых с goto и выглядит трудноваримым, а другой без goto: http://programmersforum.ru/showpost....8&postcount=21

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Ну и пожалуйста. Я двумя руками за и даже не отказался бы от такого в Delphi (я на нём пишу).
Ну так о том и речь, что нужна поддержка со стороны языка для подобных ситуаций, что бы не городить спагетти.

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Это - GOTO и метки в явном виде. Даже хотя они так не называются. И говорить что вот этот вот код надо переписать, потому что тут GOTO, а вот тот код надо использовать, потому что там именованные блоки - это двоемыслие в чистом виде. Типа, если цветы переименовать в тырбырмыр, то дарить их девушке уже не надо?
Опять не согласен. Goto более низкоуровневая конструкция. Здесь же просто именованные блоки, мы указываем из какого блока надо выйти или в какой блок надо выйти. А метка может находится в произвольном месте любого блока, что снижает понятность кода. Что бы было понятнее, еще один пример (абстрагируясь от языка, т.к. Pascal такого, на сколько я понимаю, даже не позволит):

Код:
procedure XXX;
begin
  ...
  if <...> then exit;
  ...
end;
begin
  ...
  XXX;
  ...
end.
Тут exit - это как раз выход из блока (или тела процедуры). Можно его сравнивать с goto, но это более высокоуровневая конструкция, ибо:
Код:
procedure XXX;
begin
  ...
  if <...> then goto main_next;
  ...
end;
begin
  ...
  XXX;
  main_next:
  ...
end.
Надеюсь, вам не придет в голову говорить, что данный код ничем принципиально не отличается от предыдущего.
Arigato на форуме Ответить с цитированием
Старый 12.01.2012, 22:42   #32
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Вот возникла рабочая ситуация...

Программа - граббер ссылок с сайта...

Собственно все в 3 цикла(вложены друг в друга).

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

Заказчик доволен, но сказал, что хочет, чтобы программа запроминала, что качала ранее(первая ссылка) и переходила к след. стилю.

Код:
    //Перебор стилей, с которых собираем ссылки
    for nStyle_Current := 0 to fStylesList.Count - 1 do
    begin
       //Перебор страниц в стиле
       for nStyle_CurrentPage := 1 to nStyle_PageCount do
      begin

         //Перебор ссылок на отдельные страницы с файлами
        for nNews_CurrentPage := 0 to fNewsList.Count - 1 do
        begin

          {
            И вот тут самое главное. Если текущая nNews_CurrentPage уже  закачивалась ранее, то я должен выпрыгнуть из 2 цыклов: 
for nNews_CurrentPage := 0 to fNewsList.Count - 1 do и for nStyle_CurrentPage := 1 to nStyle_PageCount do

т.е. нужно чтобы программа перешла к обработке след. элемента цикла
for nStyle_Current := 0 to fStylesList.Count - 1 do
          }
          if (fNewsList.Strings[nNews_CurrentPage] = fStylesList.Styles
            [nStyle_Current].LastLink) then
          begin
            Log('Ссылка "' + fNewsList.Strings[nNews_CurrentPage] +
              '" закачивалась ранее...');
            Break; //это проблему не решает..
          end;

        end; // style news list

      end; // Spyle page list

    end; // StulesList
Как я могу выйти из ситуации и можно ли тут GOTO?

Последний раз редактировалось Человек_Борща; 12.01.2012 в 22:47.
Человек_Борща вне форума Ответить с цитированием
Старый 12.01.2012, 23:02   #33
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)почему бы не применить TStrings.IndexOf?
2)я бы оформил как функцию перебор страниц в стиле.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.01.2012, 23:10   #34
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Конкретно по вопросу - выход из цикла по GOTO допустим
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.01.2012, 00:09   #35
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Конкретно по вопросу - выход из цикла по GOTO допустим
Теперь вопрос: как?

Код:
label lab;

var
  i1,i2,i3:Integer;
begin
  for i1=0 to 1 do
  begin

  lab: continue; //Так? 

    for i2:=0 to 2 do
    begin
       for i3:=0 to 3 do
       begin
          If 1 = 1 then GOTO lab; 
       end;
    end;
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 13.01.2012, 00:13   #36
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно и без continue
Код:
for i1=0 to 1 do
  begin
    for i2:=0 to 2 do
    begin
       for i3:=0 to 3 do
       begin
          If 1 = 1 then GOTO lab; 
       end;
    end;
    lab:
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.01.2012, 00:14   #37
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Видимо имелось в виду
Код:
  for i1=0 to 1 do
  begin
    for i2:=0 to 2 do
    begin
       for i3:=0 to 3 do
       begin
          If 1 = 1 then GOTO lab; 
       end;
    end;
  end;
end;
lab:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.01.2012, 00:19   #38
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Насколько понял имеется в виду выход из 3-его в 1-ый цикл, а не за пределы 1-го
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.01.2012, 00:23   #39
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Можно и без continue
нужно, иначе до второго цикла так и не дойдет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.01.2012, 00:44   #40
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
нужно, иначе до второго цикла так и не дойдет.
Зачем? Вернется на начало 1-го и дальше по циклу. Тот Continue тоже самое делает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
зачем учить Pascal krot_zdes Свободное общение 52 31.05.2011 16:48
Зачем эта перменная (Delphi) reasons Помощь студентам 9 15.07.2010 22:22
Метки в Tbarseries (Delphi 7) Николай ПН Помощь студентам 0 31.03.2010 18:40
Что такое коды ASCII и зачем они?? Ларик Помощь студентам 2 27.01.2008 19:41
обновление в блоге - Ресурсы. Зачем они нужны. Pblog Обсуждение статей 0 27.05.2007 03:17