OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 26 Март, 2019 05:24

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Среда, 22 Октябрь, 2008 19:33 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7997
Откуда: Троицк, Москва
Axcel писал(а):
... Если в WHILE невозможно однозначно определить условие выхода (нужна обработка доп. условия в теле цикла или дублирование), то, следовательно ...

... нужно срочно почитать Дейкстру и Гриса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Среда, 22 Октябрь, 2008 20:16 

Зарегистрирован: Четверг, 18 Сентябрь, 2008 18:31
Сообщения: 36
а так можно?
Код:
REPEAT
    block1;
    IF cond THEN EXIT;
    block2
UNTIL cond

и LOOP нет и дублирования :)
---
";" праильно расставил?
не привык еще к ";" как к разделителю... :oops:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Среда, 22 Октябрь, 2008 20:33 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1537
Откуда: Беларусь, Минск
Компилятор будет компилировать EXIT только внутри LOOP. А если бы и было такое возможно, то ничем бы ни было лучше первоначального варианта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Среда, 22 Октябрь, 2008 22:18 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 293
Откуда: Київ, Україна
Info21 писал(а):
... нужно срочно почитать Дейкстру и Гриса.

Вот не понимаю я, почему на oberoncore есть такая традиция:
есть конкретный вопрос, есть конкретная проблема, зачем нужны такие посты???
Они не в тему.... При всем моем уважении, ну зачем не втему писать??? Неужели нельзя создать новую тему "Циклы" и там развивать проблему Циклов. Здесь конкретная, реальная тема - ZipInflate.
Вот я бы на Вашем месте, если бы меня так это волновало, переписал бы код и сказал: ВОТ СМОТРИТЕ КАК НУЖНО БЫЛО СДЕЛАТЬ,
с учетом существующего компилятора и операционной системы.

А так на словах... я тоже могу "сильно умные" фразы говорить.

В этом и проблема "оберон-собщества" (как и всех бывших республик СССР): на словах все умные, а как делать, так пусть кто то другой...

PS: Извините за резкость...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 09:44 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7997
Откуда: Троицк, Москва
bohdant писал(а):
Info21 писал(а):
... нужно срочно почитать Дейкстру и Гриса.

Вот не понимаю я, почему на oberoncore есть такая традиция:
есть конкретный вопрос, есть конкретная проблема, зачем нужны такие посты??? Они не в тему.... Неужели нельзя создать новую тему "Циклы" и там развивать проблему Циклов. ...
PS: Извините за резкость...

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

Но это не всегда возможно, во-первых, объективно (обсуждение конкретного примера про циклы можно отнести как к ветке про циклы, так и к конкретной ветке о конкретном произведении программирования).

Во-вторых, новые ответвления возникают спонтанно и естественно.
Если сразу отослать людей в другую тему, то обсуждение "сломается", так часто бывает. Лучше пусть выскажутся, и тогда уж отфильтровать в новую тему. (Что нужнжо постоянно работать с переупорядочиванием копящейся информации -- хорошо известно. Например, в мануале моего personal information manager [InfoSelect] об этом настойчиво говорится -- отчего и PIM такой хороший, что авторы проблему понимают. А создателям форумных движков -- нет, и никаких удобств специально для этого не предусматривают. Потому что программеры -- en masse страдают синдромом "туннельного кругозора".)

В-третьих, моё высказывание всё-таки, считаю, в тему:
Эта тема разве не о грубой ошибке в цикле?
Разве причина ошибки -- не необученность?
Почему бы эту причину тут заодно не обсудить?

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

Если бы я портировал такой цикл, то ни за что не оставил бы его без переделки на дейкстровский -- этому научил опыт (в том числе заимстования процедур из известной псевдо-библии "Numerical Recipes").

Построение циклов -- самый рыхлый в практическом программировании "в малом" пункт у большинства ИТ-народонаселения. Обсуждаемые пример это только доказывает, причем очень ярко, и лишний раз подтверждает мой опыт.
И я этот пример буду цитировать со ссылкой на Штирлица в своем курсе -- как раз подробный разговор про циклы близок; оба варианта у меня заколлекционированы.

А здесь вслух скажу Штирлицу спасибо за прекрасный пример.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Воскресенье, 26 Октябрь, 2008 21:27 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Еще одна ошибка в ZlibInflate
функция
PROCEDURE NeedOut (VAR s: Stream; VAR wavail: INTEGER): BOOLEAN;
BEGIN
IF wavail = 0 THEN
IF (s.write = WindowSize) & (s.read # 0) THEN
s.write := 0; wavail := s.read - 1
END;
IF wavail = 0 THEN
Flush(s);
IF (s.write = WindowSize) & (s.read # 0) THEN
s.write := 0; wavail := s.read - 1
END;
IF wavail = 0 THEN
RETURN FALSE
END
END
END;
RETURN TRUE
END NeedOut;
должна быть поправлена на
PROCEDURE NeedOut (VAR s: Stream; VAR wavail: INTEGER): BOOLEAN;
BEGIN
IF wavail = 0 THEN
IF (s.write = WindowSize) & (s.read # 0) THEN
s.write := 0; wavail := s.read - 1
END;
IF wavail = 0 THEN
Flush(s);
IF s.write < s.read THEN wavail := s.read - s.write - 1
ELSE wavail := WindowSize - s.write
END;
IF (s.write = WindowSize) & (s.read # 0) THEN
s.write := 0; wavail := s.read - 1
END;
IF wavail = 0 THEN
RETURN FALSE
END
END
END;
RETURN TRUE
END NeedOut;

Из-за этого функция
PROCEDURE Uncompress* (VAR src, dst: ARRAY OF Byte;
srcoffset, srclen, dstoffset, dstlen: INTEGER;
VAR len: LONGINT; VAR res: Result);
работает с ошибками, когда размер данных >32768
P.S. В Bluebottle (A2) - ошибка тоже есть


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Воскресенье, 26 Октябрь, 2008 22:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7997
Откуда: Троицк, Москва
Штирлиц писал(а):
Еще одна ошибка в ZlibInflate
Вот пожалуйста пример: когда что сия функция возвращает. (Не говоря, что функция не чистая.)

Пять минут усилий по приведению к одному RETURN простыми стандартными тождественными преобразованиями мало того, что проясняют чуть-чуть смысл, так еще и укорачивает фукнцию на две строчки даже без изменения фактуры программы:

Код:
PROCEDURE NeedOut (VAR s: Stream; VAR wavail: INTEGER): BOOLEAN;
BEGIN
   IF wavail = 0 THEN
      IF (s.write = WindowSize) & (s.read # 0) THEN
         s.write := 0; wavail := s.read - 1
      END;
      IF wavail = 0 THEN
         Flush(s);
         IF s.write < s.read THEN
            wavail := s.read - s.write - 1
         ELSE
            wavail := WindowSize - s.write
         END;
         IF (s.write = WindowSize) & (s.read # 0) THEN
            s.write := 0; wavail := s.read - 1
         END;
      END;
   END;
   RETURN  wavail # 0
END NeedOut;

Щас еще посмотрю...

Впечатление, что это какой-то внутренний кусок хреново спроектированного цикла WHILE...

А в общем я бы не принял такое от своих студентов. Хреновый код. Хотя бы потому что возвращаемый результат избыточен. Грязь. Бр-р-р-р-р...

И вообще гипотеза: в инструкции
wavail := s.read - s.write - 1
-1 -- лишняя. Это, видимо, не ошибка, а просто маленькая неэффективность.
Поздно....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Понедельник, 27 Октябрь, 2008 23:12 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7997
Откуда: Троицк, Москва
Info21 писал(а):
Впечатление, что это какой-то внутренний кусок хреново спроектированного цикла WHILE...

...причем именно дейкстровского (т.е. >=2-веточного), потому они и не смогли его четко построить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Четверг, 30 Октябрь, 2008 00:21 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 572
Откуда: Россия, Санкт-Петербург
Neus писал(а):
а так можно?
Код:
REPEAT
    block1;
    IF cond THEN EXIT;
    block2
UNTIL cond

и LOOP нет и дублирования :)
---
";" праильно расставил?
не привык еще к ";" как к разделителю... :oops:


Лучше так
Код:
REPEAT
  block1;
  IF ~ cond THEN blok2;
UNTIL cond;

Всё равно проверка идёт на каждой итерации, а так и выходов лишних нету...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB