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

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

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

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

Сообщение скалогрыз » 22.10.2020 09:32:41

Seenkao писал(а):Я этого не говорил, а ты уже могилу человеку вырыл, даже не дав ему ни одного шанса.

я не рою человеку могилу, я пытаюсь команде подстелить соломку.
для оценки рисков, всегда нужно рассматривать худшие "что если".
Какой человек будет в итоге, он покажет сам; Но если в итоге, будет вариант худший, то виноваты будут те, кто к этому не подготовился.

т.е. если выбирать между человеком, который "пишет непонятный (другим), но чудесным образом работающий код", и которым "пишем понятный (другим) код", я выберу последнего.
Потому что код понятный другим, эти другие могут понять и отладить.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение jsa » 22.10.2020 09:35:16

Seenkao писал(а):jsa, в свете "нового" поколения и неограниченных ресурсов, вы конечно можете обойтись без безусловного перехода.

Пафосно, но мимо, и про новое поколение и про неограниченные ресурсы.
Обучение с выбиванием GoTo из памяти, происходило на СМ ЭВМ в 1993году https://www.computer-museum.ru/histussr/sm_evm.htm
Последний год, когда они в терминальном кабинете стояли, потом на факультете появилось аж 3 шт IBM PC/XT. то ли 286, то ли 386
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

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

Сообщение Pavia » 22.10.2020 10:44:59

Сквозняк писал(а):А с переводом не всё хорошо, часть его грохнули и всё подмяли под лазарус. Та справка в html формате, что идёт вместе с дистрибутивом исходников - вообще без перевода! А именно несколько её файлов открыты у меня в браузере почти постоянно. Также её можно открывать в fp-ide, но там хуже видно чем в браузере.

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

Сквозняк писал(а):И зачем для такой простой вещи подключать лазарус с другим диалектом паскаля и всё усложнять указателями и прочей хренью? Мой пример нормально работает при

Это потому, что Вы языка не знаете. Указатели в паскале были с самого первого момента его появления. И тут всё в рамках стандарта.

Сквозняк писал(а):А мой код должен принести _мне_ пользу и быть по возможности нереализуем другими программистами увидевшими конечный результат. Капитализм на дворе и сражение за миску супа. Кто проиграл, тот бомж и подыхает под мостом. Причём мой код нормально пишется и анализируется из консольки, в простой паскалевской ИДЕ, и не требует Rad студии. И какой из кодов тогда более токсичный?

Вы через полгода сами забудете, что там навояли и не разберётся.Rad студия создана для облегчения труда архитекторов, что бы те могли напрягать простых кодеров.
Сквозняк писал(а): Как ООП, так и несчастье - то из стека вылетишь, то память подтекает.

Вот вам и не качественный код. Стандарты по оформлению кода как раз и были придуманы для снижения ошибок. Я да же не помню когда у меня последний раз вылетал стек. У меня с ООП и качественным кодом память не протекает.
На коротких функция сразу видно, что -1 в for забыл дописать.
Сквозняк писал(а):Не знаю, что это за операторы, но про асинхронность вы сильно ошибаетесь. Давно уже сказано, что на паскале можно написать всё. А вот как это "всё" писать без гото и касе, данный мыслитель ничего не изрёк.

Это Вы просто не дочитали. Я же сказал кооперативная многозадачность. А пример есть у Вирта в его A2 (ОС Оберон)
Маленькая часть не должна уметь всего. Ну а количество параллельных времён там около десяти, так что даже и время там показать не такая простая задача. Говорю же, есть в паскале асинхронность, это в лазарусе её так сломали, что приходится кидать на форму элемент "будильник" - тимер :mrgreen: и прописывать в его обработчике кучу событий.

Ну это от того что народ не умеет правильно писать асинхронный код. Взять хотя бы Виндоус там приоритеты у нитей сделаны с таким переподвыпердом, что в двух словах и не опишешь. Там обычный спинлок вешает соседнию нить из общего потока! На Линуксе в Qt таже хрень только с сетевыми операциями. DeadLock прилетает из ядра. Зато идея когда у каждого объекта есть свой таймер просто супер!

Seenkao писал(а):Ну, и теперь, самое важное. Где мы не сможем не использовать оператор безусловного перехода? (конечно же всегда сможем, но как мы перед заказчиком отчитаемся, почему наша программа не работает должным образом?).
Если в голове бордак, то и в коде бордак. Для этого с начало и планируют чтобы такого не было.

Seenkao писал(а):онечно тебя будут держать, ведь ты умеешь писать красиво код. Подумаешь он полгода будет работать. А вот того, в очках "профессора" выкинут. Ну и что, что у него практически не вылетает код, но он там непонятные каракули рисует в коде и код через какие-то непонятные места работает, но вылетать не хочет. Пшёл он вон.

Не путайте божий дар с яишнейей. Это не профессора. Профессор должен уметь передать знания следующему поколению. Поэтому профессора пишут качественный код.
А вот это либо стажёры либо математики, от слов совсем не программисты такой говнокод делают. Правда я понял почему, потому что у них такой же дерьмище в ихних книжках. Третий заход, вторую неделю занимаюсь численными методами для решения уравнений. Авторы тупо копирую ошибки друг у друга.
Перевел с Алгола 3 процедуры из 2-х разных источников ни одна Карл не заработала! Слава богу перерыл 20 книг нашёл человеческое описание в 5-х книгах в 3 неполные описание либо с ошибками. В результате 2 книге которые дополняют друг друга.

Код: Выделить всё
// Перевод кода из wilkinson1962 Householder's method for symmetric matrices
procedure Tridiagonalization_Householder0(A:TMatrix; var d,e:TVector);
var i,j,k:Integer;
n:Integer;
ai,sigma,h,bj,BigK,bi:Real;
b,q:TVector;
begin
n:=A.n;
SetLength(d,n);
SetLength(e,n);
b:=e;
SetLength(q,n-1);

for j:=0 to n-1 do
   for i:=j+1 to n-1 do
     a[j,i]:=0;  {}

for i:=n-1 downto 2 do
   begin
   sigma:=0;
   for k:=0 to i-2 do
     sigma:=sigma+a[i,k]*a[i,k];
   ai:=a[i,i-1];
   // Выбираем стабильный знак.
   if ai>=0 then bi:=-sqrt(sigma) else bi:=sqrt(sigma);
   b[i-1]:=bi;
   { Если параметр sigma слишком мал, чтобы гарантировать
     ортогональность, то преобразование Хаусхолдера не выполняется
     и происходит переход к метке skip и выход из процедуры;}
   if sigma <= Tol then
     begin
     e[i]:=sigma;
     sigma:=0;
     d[i]:=bi;
     end else
     begin
     h:=sigma-ai*bi;
     a[i,i-1]:=ai-bi;

     for j:=i-2 downto 0 do
       begin
       bi:=0;
       for k:=i-2 downto j do
          bi:=bi+a[k,i]*a[i,k]; // Формирование вектора A*u
       for k:=j-2 downto 0 do
          bi:=bi+a[j,k]*a[k,j]; // формирование вектора p
       q[j]:=bi/h;
       end;
     //Вычисление параметра K
     BigK:=0;
     for j:=i-2 downto 0 do
       BigK:=BigK+a[i,j]*q[j];
     BigK:=BigK/(2*h);
     // формирование вектора q
     for j:=i-2 downto 0 do
       q[j]:=q[j]-BigK*a[i,j];
     //Преобразование матрицы A
     for j:=i-2 downto 0 do
       begin
       for k:=j-1 downto 0 do
         a[j,k]:=a[j,k]-a[i,j]*q[k]-a[i,k]*q[j]
       end;
     end; // if
   end; // i;
for i:=n-1 downto 0 do
    d[i]:=a[i,i];
e[0]:=a[1,0];
e[n-1]:=0;
end;

Вот чего оно не работает? goto был убран. Так как на код влияет заполнение верхнего треугольника или там 0, то видимо индексы выходят за пределы главной диагонали. А ещё не понятно для умножения надо сохранить vk и uk, а сохраняется только одно? Или A[i,i]<>d[i]

jsa писал(а):Последний год, когда они в терминальном кабинете стояли, потом на факультете появилось аж 3 шт IBM PC/XT. то ли 286, то ли 386

Сейчас вообще обленились оптимизировать разработчики ИИ пишут код на питоне с парсером с алгаретмической сложностью О(3) и гоняют мегобайты текстовых данных. Если за 1 час укладывается, то норм. А если нет то тогда подключают либу на Си Которая ускоряет в 1 милион раз. И подают на вход гигабайты данных.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

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

Сообщение Seenkao » 23.10.2020 00:36:09

скалогрыз писал(а):я пытаюсь команде подстелить соломку.

Да, в данном случае, для себя, ты прав.
Но в моём случае - соломкой в команде буду являться я. Так как я принимал решение кого оставлять, а кого нет.

Всё зависит от того, кто решает и какой цели добивается.
Я иду на риск, на обоснованный риск. И это мой выбор!

Pavia писал(а):Это не профессора.
ни чего что у меня слово "профессор" в кавычках? :)

что за фурмулу сделать надо?
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

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

Сообщение Alex2013 » 27.10.2020 02:39:44

Вот кстати мой сравнительно недавний пример "боевого использования" goto ...


Код: Выделить всё
/ Складываю близкие области ...
if Cl.Count>0 then begin
   L1:for  i:=0 to Cl.Count-1 do
    for  j:=0 to Cl.Count-1 do
      if (I<>J) and  Cr(TCvRect(cl[i]^),TCvRect(cl[j]^),20) then
      //CR() - Проверка пересечения прямоугольных областей "с запасом" 
       begin

         TCvRect(cl[i]^):=SumRecT(TCvRect(cl[i]^),TCvRect(cl[j]^)); //Сложение смежных областей

         Dispose( cl[j] );  cl.Delete(j); //Удаление лишней  области из списка.
        goto l1; // Некрасиво? Зато наглядно! (Перезапуск поиска  )
       end;


Интересно как тут можно "без плясок с бубном" обойтись без goto ? :idea:
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 27.10.2020 03:36:45

Испанский стыд - когда форумчане порют чушь и постят дичь, а стыдно мне. По этой причине не могу читать подобные темы. Alex2013 давай сам, пробегись по теме, собери такихже как ты сторонников гото... чтото вам объяснять - бесполезно(( в аду для вас уже греют специальную сковороду
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 27.10.2020 04:04:23

Zuв что за зуд ? Я ни где НЕ строник GoTo ...
На выше приведенный пример наткнулся случайно копаясь на фруме . Более того в оригинальной теме я честно извинялся за данную "кривулю" и (не только из за GoTo). Моя позиция ясна: чем меньше GoTo тем лучше . ( Даже в выкладываемых на форум изрядно левых поделках "для души" GoTo можно найти едва-ли пару тройку раз )

НО боятся использования GoTo все равно, что боятся операторов break, continue и exit .
Они есть и они НУЖНЫ . Точно так-же сознательно оставлен и GoTo .
Зы
В самом деле как достаточно ПРОСТО и безопасно перезапустить многоярусный цикл и из него самого БЕЗ GoTo ?
Да обойтись можно : в этом случае например "сжав" два цикла в один и выйти из него через break но это все равно усложнение и дополнительные расчеты, можно сделать циклы по while и получить доступ переменной счетчику, но это мнение надежно (что проверенно неоднократно - и именно потому что "счетчик открыт на запись", а современные ос, процессоры и компилятор умеют "играть" в многозадачность и отложенное выполнение кода ) А иногда циклы по while еще и банально медленней чем цикл по for. Вообщем "и т.д. и т.п."

Короче, вариантов "без GoTo" немало, но иногда смысла в них не так уж монго.
Последний раз редактировалось Alex2013 27.10.2020 18:32:25, всего редактировалось 3 раз(а).
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение скалогрыз » 27.10.2020 04:48:50

Alex2013 писал(а):В самом деле как достаточно ПРОСТО и безопасно перезапустить многоярусный цикл и из него самого БЕЗ GoTo ?

тормоза начнутся, когда количество cl.Count будет большим! Тормозить будет не потому что goto, а потому что в итоге получается множество повторяющихся проверок.
Попробуй так:
Код: Выделить всё
  cl.Sort( в порядке, слева-направо, сверху-вниз );

  i := 0;
  while i < cl.Count do begin
    j := i + 1;
    while j < cl.Count do begin
      if Cr(TCvRect(cl[i]^),TCvRect(cl[j]^),20) then begin
        TCvRect(cl[i]^):=SumRecT(TCvRect(cl[i]^),TCvRect(cl[j]^)); //Сложение смежных областей
        Dispose( cl[j] );  cl.Delete(j); //Удаление лишней  области из списка.
      end else
        inc(j);
    end;
    inc(i);
  end;

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

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

Сообщение Alex2013 » 27.10.2020 05:22:38

скалогрыз писал(а):тормоза начнутся, когда количество cl.Count будет большим! Тормозить будет не потому что goto, а потому что в итоге получается множество повторяющихся проверок.

Ну а что делать если каждый фрейм нужно сравнить с каждым ? (разве что сам список предварительно отсортировать можно но это ненужное усложнение )
Но главный недостаток конструкции while i < cl.Count do как я уже писал в ее потенциально меньшей надежности .
Секции кода внутри while (в отличие от "железного for" ) почти никогда незащищены от трудно уловимых сбоев особенно при сложных условиях завершения цикла . А фор прост и надежен .

Еще один вариант "без ГоуТу", в пропуске удаленных элементов без их удаления прямо во время работы циклов , тогда надобность в перезапуске автоматически пропадет, но это годится только для этой конкретной задачи и то придется удалить пустые элементы в дополнительном цикле, и что быстрее еще вопрос. (а кроме того по хорошему нужно проверить и на "вторичное объединение" что без перезапуска поиска с нуля невозможно )
Последний раз редактировалось Alex2013 27.10.2020 17:20:24, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение скалогрыз » 27.10.2020 06:03:10

¯\_(ツ)_/¯
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Alex2013 » 27.10.2020 17:22:43

скалогрыз писал(а):¯\_(ツ)_/¯

В твоем замечательном коде пропущен "сброс счетчика" ( I:=1; J:=0; после удаления элемента ) работать будет и без него но ИМХО часть фреймов может остаться не объединенными .
Однако, спасибо за попытку помочь ... :idea:

Зы
Кстати еще одна "легаси заковырка" inc и dec . Один бог ведет почему но сто раз сталкивался с тем что стоит добавить их в код и в программе могут начаться разные "аномальные явления" (Заменяю на J:=J+1; и все сразу Ок ! ).
Предполагаю что дело в том что как и работа с файлами в рамках старой унаследованной еще от дос парадигмы и на не менее древних кодах из System где никто годами не копался начали проявляться не учтенные особенности архитектуры. В "суровых консольных программах" все возможно работает и сейчас но в присутствии рабочего GUI все не так однозначно .
Последний раз редактировалось Alex2013 28.10.2020 00:51:28, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение скалогрыз » 27.10.2020 19:34:30

Alex2013 писал(а):Один бог ведет почему но сто раз сталкивался с тем что стоит добавить их в код и и в программе могут начаться разные "аномальные явления" (Заменяю на J:=J+1; и все сразу Ок ! ). ... В "суровых консольных программах" все возможно работает и сейчас но в присутствии рабочего GUI все не так однозначно .

:mrgreen: :mrgreen: :mrgreen:

Мне это напомнило недавний тред, когда люди пытались 24-битное RGB засунуть в 16-бит.

Alex2013 писал(а):В твоем замечательном коде пропущен "сброс счетчика" ( I:=1; J:=0; после удаления элемента )

там секрет есть; но как бы ладно.

Alex2013 писал(а):...но ИМХО часть фреймов может остаться не объединенными .

А вот, кстати, пугало насчёт Goto.
Если компилятор встретит использование goto где-нить в процедуре/функции, то внезапно, для это процедуры/функции оптимизация кода отключается.
Ну просто потому что компилятор не сможет предсказать поведение.

Да, в FPC оптимизатор пока что не слишком крутой (в сравнении с шлангом или gcc), но тем не менее.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Alex2013 » 27.10.2020 19:55:46

скалогрыз писал(а):Мне это напомнило недавний тред, когда люди пытались 24-битное RGB засунуть в 16-бит.

Хм как то я это пропустил (или забыл ) ... можно ссылку ? :wink:

Добавлено спустя 1 минуту 42 секунды:
скалогрыз писал(а):там секрет есть; но как бы ладно.

Пусть не сразу но заметил ... :D

Добавлено спустя 3 минуты 7 секунд:
скалогрыз писал(а):А вот, кстати, пугало насчёт Goto.
Если компилятор встретит использование goto где-нить в процедуре/функции, то внезапно, для это процедуры/функции оптимизация кода отключается.
Ну просто потому что компилятор не сможет предсказать поведение.

Дык согласен ! Хотя с другой стороны что непредсказуемого в безусловном переходе ? :roll:
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение скалогрыз » 27.10.2020 20:34:33

Alex2013 писал(а):Дык согласен ! Хотя с другой стороны что непредсказуемого в безусловном переходе ?

предсказуемо всё! точнее непредсказуемо ничего... :mrgreen:
основа оптимизации, заключается в том, чтобы следить за временем жизни/использования переменных.
По-умолчанию (с точки зрения человека), время жизни переменной - тело функции.
С точки зрения комплиятора, это не так. Он может отследить с какого момента и как переменная неиспользуется. Соответственно поместить её в более удобный регистр, и/или в стэк не записывать. Или уж тем более в память никогда не класть.

Предсказания эти строятся на анализе кода.

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

Alex2013 писал(а):Хм как то я это пропустил (или забыл ) ... можно ссылку ?

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

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

Сообщение Seenkao » 27.10.2020 23:34:49

скалогрыз писал(а):основа оптимизации
, в том, что иногда эту оптимизацию надо послать в одно место. Делаешь одно, запускаешь, а на выходе фигня... заглядываешь в скомпилированный код... ..лять, я этого не писал... :evil: Либо отключаешь оптимизацию, либо пишешь код который будет правильно воспринят. :)
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Пред.След.

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

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

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

Рейтинг@Mail.ru