(решено) GoTo или repeat until?

Форум для изучающих FPC и их учителей.

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

Re: (решено) GoTo или repeat until?

Сообщение Снег Север » 04.09.2015 18:53:01

vitaly_l писал(а):Суть в переходе из цикла в цикл, а не в выводе инфо. GoTo в моём примере прыгает из цикла в цикл...
Так если вам приходится прыгать из цикла в цикл, значит, у вас гарантированно неверно поставлена исходная задача. И никак иначе.

Добавлено спустя 6 минут 42 секунды:
Мне, за четверть века, приходилось решать сотни задач обработки информации и просматривать в разы больше профессионально написанного кода на Паскаль/Делфи и число подпрограмм, где осмысленно применялось бы goto можно пересчитать на пальцах одной руки. И были это программы портированные с более древних языков, типа Фортран.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3051
Зарегистрирован: 27.11.2007 16:14:47

Re: (решено) GoTo или repeat until?

Сообщение скалогрыз » 04.09.2015 21:10:59

vitaly_l писал(а):Если я правильно понял, суть "удаления" дословно: не только GOTO, но и всякие BREAK, CONTINUE, EXIT в середине процедуры - заключается в замене их на if AND OR IN в условии циклов. И этот Ваш академический вариант, не будет разве грузить процессор на порядок больше нежели просто: BREAK, CONTINUE, EXIT ?

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

На самом деле, AND и OR в условиях циклов разницы не сделают. Особенно в тех случаях, когда перед тем как сделать Goto, ты проверяешь условие. Такая проверка несёт ровно такуюже нагрузку, как и в условии цикла.

Но в реальной жизни, программисты, часто используют break, в теле цикла, в тех случаях, когда запись всей проверки в условии просто не практична.
В Паскале не принято, хотя встречается, писать условие while или repeat больше одной строки.
По-этому программисты частенько подменяют его for + break (в тех случаях, когда нужно обойти какой-нибудь индексированный список, н.р. массив или TList).
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 04.09.2015 21:33:02

скалогрыз писал(а):Но в реальной жизни, программисты, часто используют break, в теле цикла, в тех случаях, когда запись всей проверки в условии просто не практична. ... while или repeat больше одной строки

Да, СПАСИБО, понял, если там будет 77777 AND и OR в условии цикла, при условии что, это нужно только для одной из 88888-boolean, то разумнее вынести такое условие из условия цикла, внутрь цикла; и там, внутри цикла - оградить первым boolean, иначе цикл "сожжёт процессор" на втором обороте.
скалогрыз писал(а):
vitaly_l писал(а):По-этому программисты частенько подменяют его for + break (в тех случаях, когда нужно обойти какой-нибудь индексированный список, н.р. массив или TList).

for + break <=== вот это не понял. Я такой конструкции не встречал. Как это for + break ?


Добавлено спустя 4 минуты 56 секунд:
А... понял в while можно условие задать а в for нельзя... и поэтому break... спасибо. вник. в смысле понял.



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение скалогрыз » 04.09.2015 22:19:29

vitaly_l писал(а):Да, СПАСИБО, понял, если там будет 77777 AND и OR в условии цикла, при условии что, это нужно только для одной из 88888-boolean, то разумнее вынести такое условие из условия цикла, внутрь цикла; и там, внутри цикла - оградить первым boolean, иначе цикл "сожжёт процессор" на втором обороте.

отгородить первым boolean?
хе, условия в паскале (по стандарту языка) являются short-cut evaluated.
А это значит, что компилятор, не до проверяет значение логического выражения, если точно знает его результат (ложность или правдивость).
Как итог, правильно написанное условие цикла уже отгородит себя первым булеаном.

Например, такой вот цикл
Код: Выделить всё
i:=1;
while (i<=length(s)) and not (s[i] in 'a') do inc(i);

в паскале не упадёт, даже если строчка s пустая. (хотя казалось бы должен, т.к. s[1] при пустой строке это нарушение границ).

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

Тот же, пример, но через for+break
Код: Выделить всё
  for i:=1 to length(s) do
    if s[i]='a' then Break;

следует заметить, что цилк с for, может быть экономнее (c точки зрения CPU), в том смысле что length(s) вычисляется одиножды. Но это другая история.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 04.09.2015 22:34:40

скалогрыз писал(а):компилятор, не до проверяет

А программа? или это была очепятка?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Снег Север » 04.09.2015 22:37:54

vitaly_l писал(а):
скалогрыз писал(а):компилятор, не до проверяет

А программа? или это была очепятка?
И программа не проверяет дальше заведомо выполняемое условие.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3051
Зарегистрирован: 27.11.2007 16:14:47

Re: (решено) GoTo или repeat until?

Сообщение скалогрыз » 04.09.2015 22:41:24

vitaly_l писал(а):
скалогрыз писал(а): компилятор, не до проверяет

А программа? или это была очепятка?

Компилятор генерирует такой код, что при точном определении значения выражения, дальнейшее его вычисление прекращается.
Т.е. код
Код: Выделить всё
i:=1;
while (i<=length(s)) and not (s[i] in 'a') do
  inc(i);

выполняется как
Код: Выделить всё
i:=1;
whileloop:
  if (i<=length(s)) then begin
    if not (s[i] in 'a') then begin
      inc(i);
      goto whileloop;
    end;
  end;


Важно отметить, что программисты на паскале, люди по натуре ленивые и вдумчивые, и уважают лаконичный но понятный код.
В отличии, от Си-онистов (всех любителей языков с Си-подобным языком), где приходится городить ужасные языковые конструкции, со спорной человеко-читаемостью, и все IDE уже давно генерируют 60% кода... :mrgreen: :mrgreen: :mrgreen:
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 04.09.2015 22:54:44

скалогрыз писал(а):i:=1;
whileloop:
  if (i<=length(s)) then begin
    if not (s[i] in 'a') then begin
      inc(i);
      goto whileloop;
    end;
  end;

А вот это уже 100% понятно и невозможно оспорить! Так бы сразу и сказали! Наиточнейшее объяснение! А главное в тему топика!
Спасибо!

скалогрыз писал(а):все IDE уже давно генерируют 60% кода...

Во всём есть своя прелесть. Одни любят штампованные вещи... другие любят раритетные... важно чтобы сам процесс был в радость. Например PHP мне нравится писать в блокноте++.

Обидно, что при переводе на машинный язык, одного и того же кода, "паскалевские" программы почему-то работают медленнее нежели С++. По крайней мере так говорят... А должно быть 100% одинаково. Но, если это действительно так, то: проблема в парсере (в FPC).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Снег Север » 04.09.2015 23:03:40

vitaly_l писал(а):"паскалевские" программы почему-то работают медленнее нежели С++
если вы не пишете функции ядра операционной системы, то выполняется программа за 1 миллисекунду или за 10, вас не должно тревожить...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3051
Зарегистрирован: 27.11.2007 16:14:47

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 04.09.2015 23:09:50

Снег Север писал(а):то выполняется программа за 1 миллисекунду или за 10, вас не должно тревожить...

Ну уж нет, 10 миллисекунд - это очень много, даже для веб сервера. Правда смотря для каких задач. Но если нужно обработать 2048 на 2048 px, то эти миллисекунды могут обернуться несколькими часами, вместо одной минуты. А что "паскалевские" программы действительно медленнее? Кто-то проверял? ( это технически сложно сделать, т.к. машинный код и процессор одинаковые, либо ошибка в парсере )

Добавлено спустя 37 минут 24 секунды:
скалогрыз писал(а):программисты на паскале, люди по натуре ленивые и вдумчивые, и уважают лаконичный но понятный код.
В отличии, от Си-онистов (всех любителей языков с Си-подобным языком), где приходится городить ужасные языковые конструкции

Здесь Вы попали в самое яблочко. Ленивые и от этого вдумчивые... из этого следует лаконичный, но понятный код... альтернатива ужасные языковые конструкции, не позволяющие вдуматься. Вот... ключевое слово Паскаля, этот язык позволяет: вдуматься...
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение скалогрыз » 05.09.2015 00:02:37

vitaly_l писал(а):Обидно, что при переводе на машинный язык, одного и того же кода, "паскалевские" программы почему-то работают медленнее нежели С++. По крайней мере так говорят... А должно быть 100% одинаково. Но, если это действительно так, то: проблема в парсере (в FPC)

в этом лично твоя вина. Сколько патчей для оптимизатора FPC ты послал за прошедший год?

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

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 05.09.2015 00:18:34

скалогрыз писал(а):Сколько патчей для оптимизатора FPC ты послал за прошедший год?

Я даже не слышал об этом... Куда я должен был послать патчи? И я кстати пока не жалуюсь на скорость, т.к. мои задачи сейчас выполняются, а баги которые были с интерфейсом починились в новых версиях Лазаруса и я багов последнее время вообще не вижу(тьфу, тьфу, тьфу). Хотя нет вру... в прошлом году, пробовали с картиками, там несколько постоянных жильцов форума - признали что, картинки обрабатываются явно медленнее. Но я никаких патчей никому не посылал, а куда посылать патчи? И что такое патчи? Да и что я-то могу написать про картинки? Почините картинки... там баг нужно найти... а это(найти баг) - очень сложно...
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение скалогрыз » 05.09.2015 00:29:33

Ликбез!
Так докладываются ошибки
Так создаются патчи

Добавлено спустя 1 минуту 12 секунд:
vitaly_l писал(а):Почините картинки... там баг нужно найти... а это(найти баг) - очень сложно...

и я замечу, что баг найти сложно, даже без Goto. а с Goto было бы невозможно.
И где проблема обсуждалась?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 05.09.2015 00:38:43

скалогрыз писал(а):Ликбез!

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

не спорю, про GoTo - верю на слово.
Обсуждали здесь(там 7 листов): http://freepascal.ru/forum/viewtopic.php?f=5&t=8742

Добавлено спустя 55 минуты 55 секунд:
Там на 4-5 странице делали эксперименты, со скоростью и выяснилось что тормозит TPicture (или около того), но я незнаю может это уже починили.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Снег Север » 05.09.2015 06:33:26

TPicture никто не чинил и чинить не станет, поскольку большинству программистов малоинтересно решение такой узкоспециальной задачи, как была там у вас, а переделка кода потребуется огромная. Для быстрой работы с графикой используют не TPicture, а функции DirectX или OpenGL.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3051
Зарегистрирован: 27.11.2007 16:14:47

Пред.След.

Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru
cron