goto - с любимыми не расставайтесь, или break не тащит

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 01.11.2020 12:39:51

Снег Север писал(а):Повторю еще раз

Вы что, пытаетесь мне отказать в праве высказать свою точку зрения?
Кмк я не оспаривал чьи-либо религиозные убеждения, поскольку, безусловно, понимаю, что это абсолютно бессмысленно.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Снег Север » 01.11.2020 12:55:21

iskander, а я что, специально вам адресовал???
Можете считать, что я Торвальдсу отвечал... :)
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 01.11.2020 12:57:50

Принято.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение zub » 01.11.2020 14:13:14

Сквозняк
>>Для этого писать нужно так:
и чему там равно a3?
Ничему - в 1 ты не знаешь цикл отработал или прервался.

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

Добавлено спустя 4 минуты 47 секунд:
https://bugs.freepascal.org/view.php?id=34248 после обновления компилятора программа перестала работать на ровном месте, циклы там рвались как goto так и бреак. конечно это не совсем в тему, но как пример пример наказания за чужие "лайфхаки"

Добавлено спустя 11 минут 32 секунды:
runewalsh
>>— goto вряд ли портит оптимизацию, он в плане отслеживания control flow не отличается от того же break.
Отличается. бреак выйдет из блока кода, гото может прыгать куда угодно

>>— У goto есть более-менее приемлемые применения:
это входит в какойто стандарт или следствие внутренней fpc реализации?

Добавлено спустя 2 часа 6 минут:
>>>>— goto вряд ли портит оптимизацию
Проверил, да, в примитивных случаях например выход сразу за цикл не портит
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 01.11.2020 17:42:19

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

Так цель прыжка статична и заранее известна, никакой принципиальной разницы с тем же break и просто управляющими конструкциями. Goto как оператор вообще традиционно ведёт себя порядочно: в C++, например, goto ИЗ скоупа автоматической переменной вызывает её деструктор, а goto В скоуп таковой запрещён. В FPC похожим образом запрещён goto, пересекающий try (хотя, честно говоря, можно было и сделать).
zub писал(а):это входит в какойто стандарт или следствие внутренней fpc реализации?

Так в C все делают (Торвальдс вот).
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Seenkao » 01.11.2020 18:16:27

Смысл мусолить тему вдоль и поперёк? Вы ни когда не придёте к общему соглашению!

Я буду использовать GoTo потому что я прекрасно понимаю, что я (именно я, а не программа за меня) хочу сделать. И если мне надо будет писать высокую логику, то извините, подвиньтесь. Есть большая вероятность что вы там стандартных вызовов процедур вообще не увидите, а как раз GoTo будет навалом. Вы увидите тонну кода, меня заваленного исписанной бумагой, может где-то в коде наткнётесь, что там обрабатывается выход... и! Даже если я буду комментировать ВЕСЬ код, то боюсь вы в нём ещё полгода будете ползать и не поймёте: "почему же он работает??? :shock: "

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

И! Оба будут правы! Каждый по своему.

Тут мне кричат:
не имеет нормальная программа множественных вложенных циклов.

Ну не имеет, так не имеет. Подумаешь, когда я танки писал, делал два-три вложенных цикла, которые рвал. Ну выполнились условия, зачем мне дальше в этих циклах копаться? Надо будет, таким же путём вернусь и продолжу. Причём продолжу с того же момента и с теми же параметрами, что и изначально!!! Если мне это надо будет.

Но вы поймите: Так делать нельзя!!!, вы голову свою расшибёте. У меня ладно, она уже и так вся дырявая... :mrgreen:
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Сквозняк » 01.11.2020 21:37:33

Снег Север писал(а):Соответственно, код, который малопонятен и нечитабелен - это говнокод. Вне зависимости от его прочих свойств.

Какое замечательное описание ООП!
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 01.11.2020 21:50:22

Ну что же, я честно пытался обратить внимание участников этой темы на что-нибудь чуть более полезное, чем переливание из пустого в порожнее.
Эта AnySort, судя по истории, висит в вике уже четыре года и даже обрастает "усовершенствованиями"(что, к сожалению, наводит на весьма грустные мысли).

Результат довольно-таки забавный - отреагировали всего два человека, причём один из них именно тот, которого я попросил этого не делать. Похоже !НЕТ GOTO! гораздо важнее.

Поскольку эта сортировка на массиве [1,5,8,7,3,4,6] выдаёт результат [1,3,5,4,6,7,8], лично я голосую за вариант "Что-то иное".

runewalsh, у вас ещё не пропало желание поделиться своими соображениями?
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Сквозняк » 01.11.2020 22:22:08

zub писал(а):и чему там равно a3?
Ничему - в 1 ты не знаешь цикл отработал или прервался.

Это в тебе сказывается отсутствие опыта в применении гото. На метке 1: a3 содержит результат выполнения цикла. Если бы мне потребовалась от него иная работа, то и написал бы по другому. Например так:
Код: Выделить всё
for a3:=1 to z2[0] do begin
     if z2[a3]=0 then goto 1;
     if a3=z2[0] then goto 1;
                               end;
goto 2;
1:

Для теста сойдёт и имитация полезной деятельности. Главное что работает. Как появится необходимость, так и конструкция примет полезную форму. Конечно, одно goto можно заменить на break, но в свете того что оно не везде работает, нужно быть готовым обойтись без него.
zub писал(а): С учетом того что в fpc на это не приделан варнинг, поиск и исправление этих ошибок в чужих исходниках (любителей гото и прочих извращений) превращается в грандиозный нетрадиционный секс

Фигня по сравнению с поиском утечки памяти после глушения дочерней формы. А уж вопрос, почему дочерняя форма валится, если она сама в себя загрузит данные, почти философский. Пройдись по коду поиском и пропиши в каждый цикл for принудительный выход на максимальном значении индекса и будет тебе счастье. Об этом должны были преподы в умных книжках написать, но они вместо полезной информации устроили дрочилово на пузырьки, решение формул и прочие "базовые" алгоритмы.

zub писал(а):Добавлено спустя 4 минуты 47 секунд:
https://bugs.freepascal.org/view.php?id=34248 после обновления компилятора программа перестала работать на ровном месте, циклы там рвались как goto так и бреак. конечно это не совсем в тему, но как пример пример наказания за чужие "лайфхаки"


Так там как раз ни в одном примере goto не применялся. Если через него вышли из цикла, то цикл не завершён и компилятор ожидает чего-то такого:
Код: Выделить всё
for a3:=1 to 100 do begin
     if z2[a3]=0 then goto 1;
2:
     if a3=100 then goto 3;
                               end;
goto 3;
1: if .............. then goto 2;
3:

Вывод: одно goto хорошо, а три лучше.
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 01.11.2020 22:30:41

iskander
Говорю же, я нашёл ошибку, просто она «слишком очевидная», поэтому решил рассказать что-нибудь поинтереснее.
Ошибка в том, что когда мы свапаем iL-й и iR-й элементы, и один из этих индексов равен iM — указывает на опорный элемент, нужно исправить iM.
Этой проблемы не будет, если запомнить сам опорный элемент (а не его индекс) в локальной переменной, как обычно и делают; так сделано и в моём варианте, т. к. это быстрее, чем лишние ветвления.

Вторая ошибка — ^array[word] of byte вместо просто pByte.

Там, кстати, автор — @скалогрыз, можешь его трясти.
Последний раз редактировалось runewalsh 01.11.2020 22:44:15, всего редактировалось 1 раз.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Сквозняк » 01.11.2020 22:44:01

Зато всё в сишном стиле - на указателях. Чисто академическое "искусство". Проще вообще не вникать в такой код и при необходимости слепить на резиновых или фиксированных массивах для хранения данных. А уж как это будет называться, станет ясно потом.
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Seenkao » 01.11.2020 23:05:34

iskander, честно говоря, не до сортировки массивов сейчас :( , а вот тема с GoTo, походу, всегда будет завораживающей. )))

Сквозняк писал(а):Какое замечательное описание ООП!
ООП - это очень хорошая задумка! И очень плохая реализация... Лезут все кому не лень, не зная программирования. Но ведь ООП терпит, в отличии от процедурного программирования, почему бы не навалить кучу кода? А потом этот код за основу берётся... )))
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение zub » 01.11.2020 23:11:07

Сквозняк
>>Если бы мне потребовалась от него иная работа, то и написал бы по другому. Например так:
Уже как минимум 2 гото для выхода с сохранением переменной. не многим лучше установки флага о прерывании цикла

Быдлокодте в меру своей испорченности. умываю руки
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 02.11.2020 08:06:19

runewalsh, спасибо, насчёт аффтора я в курсе, будем надеяться, что он сюда ещё заглянет.
Кроме вышеупомянутого, у AnySort ещё неопределённое поведение на пустом массиве и потенциально оно же(хотя и с малой вероятностью) при вычислении индекса опорного элемента.
В итоге у меня получилось так:
Код: Выделить всё
unit anysort;

{$ifdef fpc}{$mode delphi}{$endif}

interface
type
  TCompareFunc = function (const elem1, elem2): Integer;

procedure AnySort(var Arr; Count: Integer; Stride: Integer; CompareFunc: TCompareFunc);

implementation

procedure AnyQuickSort(var Arr; idxL, idxH: Integer;
  Stride: Integer; CompareFunc: TCompareFunc; var SwapBuf);
var
  ls,hs : Integer;
  li,hi : Integer;
  mi    : Integer;
  ms    : Integer;
  pb    : PByte;
begin
  pb:=@Arr;
  li:=idxL;
  hi:=idxH;
  mi:=li+(hi-li) div 2;
  ls:=li*Stride;
  hs:=hi*Stride;
  ms:=mi*Stride;
  repeat
    while CompareFunc( pb[ls], pb[ms] ) < 0 do begin
      inc(ls, Stride);
      inc(li);
    end;
    while CompareFunc( pb[ms], pb[hs] ) < 0 do begin
      dec(hs, Stride);
      dec(hi);
    end;
    if ls <= hs then begin
      Move(pb[ls], SwapBuf, Stride);
      Move(pb[hs], pb[ls], Stride);
      Move(SwapBuf, pb[hs], Stride);
      if li = mi then
        ms := hs
      else
        if hi = mi then
          ms := ls;
      inc(ls, Stride); inc(li);
      dec(hs, Stride); dec(hi);
    end;
  until ls>hs;
  if hi>idxL then AnyQuickSort(Arr, idxL, hi, Stride, CompareFunc, SwapBuf);
  if li<idxH then AnyQuickSort(Arr, li, idxH, Stride, CompareFunc, SwapBuf);
end;

procedure AnySort(var Arr; Count: Integer; Stride: Integer; CompareFunc: TCompareFunc);
var
  buf: array of byte;
begin
  if Count > 1 then
    begin
      SetLength(buf, Stride);
      AnyQuickSort(Arr, 0, Count-1, Stride, compareFunc, buf[0]);
    end;
end;

end.

Seenkao писал(а):iskander, честно говоря, не до сортировки массивов сейчас

Так похоже и раньше было не до них, пузырьковая сортировка целочисленного массива:
Код: Выделить всё
procedure BubbleSort(var a: array of Integer);
var
  I, Tmp: Integer;
  Done: Boolean;
begin
  if Length(a) > 1 then
    repeat
      Done := True;
      for I := 1 to High(a) do
        if a[I - 1] > a[I] then begin
          Done := False;
          Tmp := a[I];
          a[I] := a[I - 1];
          a[I - 1] := Tmp;
        end;
    until Done;
end;
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение скалогрыз » 02.11.2020 10:24:53

runewalsh писал(а):Там, кстати, автор — @скалогрыз, можешь его трясти.

а?! чё?! где я опять накосячил?

runewalsh писал(а):Вторая ошибка — ^array[word] of byte вместо просто pByte.

я не люблю поинтерную арифметику по причине не сильно понятного синтаксиса. (...с PChar-ом я ужился, да)
И если я правильно помню, то Delphi 7, то ли так не могла (PChar - спец исключения), то ли надо было pointer math включать явно.
по-этому делаю всё через явные массивы, потому что и на FPC и на Delphi одинаково функционируют


Почему array[Word]? потому что array[Integer] сделать нельзя, ибо "data element too large" (такой тип не влезет в стэк на 32-битке)

Почему array[Word] в данном случае не сильно вредит, потому что array[i] берёт индекс от Integer.
Может упасть при включённом RANGECHECK. (т.к. компилятор будет проверять влазит ли index в array[Word]), соответственно RANGECHECK нужно для AnySort отключать. Естественно в implementation, а не вообще во всей программе.

Использование Move... ну да, это не добавляет эффективности.
Можно "внутренние" версии дописать для случаев Stride 1,2,4 и 8. Где вместо Move, будет перемещение через PByte, PWord, PInteger ну и PInt64 соответственно.

Остально не смотерл, но скажу, что это же вики! Смело правьте! я только за!
Публикуйте свои варианты с дженериками! Кладите на Github! чтобы всем было, и с нуля не нужно было писать!

---
подправил вики.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru