OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 25 Апрель, 2019 22:50

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




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

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Вопрос к знатокам Bluebottle (A2).
А под A2 ZipInflate нормально работает?
Нет ли проблем при распаковке файлов длиной > 32768 байт?


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

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1096
Откуда: Украина, Киев
Провёл простейший тест.
Извлёк содержимое WMBunnyImages.tar, упаковал в WMBunnyImages.zip.
Выполнил:
Код:
WMBunny.Insert WMBunnyImages.zip://aos1.gif 25 -15 ~
WMBunny.Insert WMBunnyImages.zip://aos2.gif 25 10 ~
WMBunny.Insert WMBunnyImages.zip://aos3.gif 25 15 ~
При этом из zip архива должны прочитаться файлы с размерами 135044, 51484 и 47490 байт соответственно. Всё работает. Проблемы похоже нет.


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

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Нашёл, где ошибка
Ошибка в PROCEDURE InflateCodes (VAR s: Stream);
Код
| CodeStart: (* try fast inflation while enough space available *)
IF (wavail >= 258) & (s.in.avail >= 10) THEN
InflateFast(s, wavail);
IF s.res.code # ZC.Ok THEN
IF s.res.code = ZC.StreamEnd THEN s.decode.state := CodeWash
ELSE s.decode.state := CodeBad
END
END;
EXIT
END;
s.decode.tree := s.decode.lltree;
s.decode.state := CodeLen
Надо поправить вот так
| CodeStart: (* try fast inflation while enough space available *)
IF (wavail >= 258) & (s.in.avail >= 10) THEN
InflateFast(s, wavail);
IF s.res.code # ZC.Ok THEN
IF s.res.code = ZC.StreamEnd THEN s.decode.state := CodeWash
ELSE s.decode.state := CodeBad; EXIT
END
END
END;
IF s.decode.state # CodeWash THEN
s.decode.tree := s.decode.lltree;
s.decode.state := CodeLen
END

На файлах <= 32768 она не проявляется, а на >32768 иногда нет, иногда - да(чаще всего)
В Bluebottle (A2) - она тоже есть


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8060
Откуда: Троицк, Москва
Штирлиц писал(а):
Нашёл, где ошибка

Классика. Дурно сделанный цикл.
Правильно дедушка Вирт выкинул LOOP из Оберона-07.


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

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Штирлиц писал(а):
Нашёл, где ошибка

Неплохо бы закаинуть в Bug Report http://www.ocp.inf.ethz.ch/forum/index.php/board,7.0.html

Info21 писал(а):
Классика. Дурно сделанный цикл.
Правильно дедушка Вирт выкинул LOOP из Оберона-07.


У меня есть подозрение, что этот код с Си был портирован. Уж очень стиль написание похож.
А LOOP тут не причем, как мне кажется, просто код запутанный и скорее всего когда портировали лажанулись.


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

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1096
Откуда: Украина, Киев
Info21 писал(а):
Правильно дедушка Вирт выкинул LOOP из Оберона-07.
Не надо его никуда выбрасывать :) С помощью LOOP отлично выражается один из вариантов цикла в ДРАКОНе.
Код:
PROCEDURE loop;
BEGIN
  LOOP
    block1;
    IF cond THEN EXIT END;
    block2;
  END; (* LOOP *)
END loop;


Вложения:
Комментарий к файлу: ДРАКОН-схема
loop.PNG
loop.PNG [ 1.57 КБ | Просмотров: 11318 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ZipInflate под Bluebottle (A2)
СообщениеДобавлено: Среда, 22 Октябрь, 2008 10:34 
Аватара пользователя

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

Как это ни при чем??
Если бы пришлось переделывать на дейкстровский while, ошибка сразу вылезла бы.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8060
Откуда: Троицк, Москва
Ярослав Романченко писал(а):
Info21 писал(а):
Правильно дедушка Вирт выкинул LOOP из Оберона-07.
Не надо его никуда выбрасывать :) С помощью LOOP отлично выражается один из вариантов цикла в ДРАКОНе.
Код:
PROCEDURE loop;
BEGIN
  LOOP
    block1;
    IF cond THEN EXIT END;
    block2;
  END; (* LOOP *)
END loop;

Надо выбрасывать. Это же тривиально выражается через while.


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

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1096
Откуда: Украина, Киев
Info21 писал(а):
Если бы пришлось переделывать на дейкстровский while, ошибка сразу вылезла бы.
Если-бы создавалось на ДРАКОНе ошибка и не закралась бы вовсе.


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

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
bohdant писал(а):
У меня есть подозрение, что этот код с Си был портирован. Уж очень стиль написание похож.
А LOOP тут не причем, как мне кажется, просто код запутанный и скорее всего когда портировали лажанулись.


именно так
потому как в С

while (1)
{
switch (mode)
{
case START:
if (....) {
.....
break; //Выход из switch, но не из while
}
....
break;
case Далее
}
.....
}


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Info21 писал(а):
Ярослав Романченко писал(а):
Info21 писал(а):
Правильно дедушка Вирт выкинул LOOP из Оберона-07.
Не надо его никуда выбрасывать :) С помощью LOOP отлично выражается один из вариантов цикла в ДРАКОНе.
Код:
PROCEDURE loop;
BEGIN
  LOOP
    block1;
    IF cond THEN EXIT END;
    block2;
  END; (* LOOP *)
END loop;

Надо выбрасывать. Это же тривиально выражается через while.
Есть вариант
Код:
PROCEDURE loop;
BEGIN
  block1;
  WHILE ~cond DO
    block2;
    block1
  END
END loop
Его минус - дублирование block1.


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

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1096
Откуда: Украина, Киев
bohdant писал(а):
Штирлиц писал(а):
Нашёл, где ошибка
Неплохо бы закаинуть в Bug Report http://www.ocp.inf.ethz.ch/forum/index.php/board,7.0.html
Не неплохо-бы, а очень нужно! :)
Автор не желает сообщить про баг? :)


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8060
Откуда: Троицк, Москва
AVC писал(а):
Есть вариант
Код:
PROCEDURE loop;
BEGIN
  block1;
  WHILE ~cond DO
    block2;
    block1
  END
END loop
Его минус - дублирование block1.

Не припомню из своей практики, чтобы было что-то кроме либо чего-то тривиального, либо вызова процедуры.

Ради экзотики усложнять всю жизнь?


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

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Ярослав Романченко писал(а):
Автор не желает сообщить про баг? :)

Отписал


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Info21 писал(а):
Ради экзотики усложнять всю жизнь?
Во-первых, такая ли уж это экзотика?
А во-вторых, все-таки дублирование кода. :)


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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1183
Info21 писал(а):
AVC писал(а):
Есть вариант
Код:
PROCEDURE loop;
BEGIN
  block1;
  WHILE ~cond DO
    block2;
    block1
  END
END loop
Его минус - дублирование block1.

Не припомню из своей практики, чтобы было что-то кроме либо чего-то тривиального, либо вызова процедуры.


Бывает, как раз block2 - что-то тривиальное, т.е. почти REPEAT.

Мне кажется проблем c LOOP было бы меньше, если бы EXIT был построже. Что-то вроде
Код:
LOOP
  block1;
WHEN cond EXIT;
  block2;
END;


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9115
Откуда: Россия, Орёл
По-моему, если ощущать цикл как "езду по рельсам инварианта", то вариант с WHILE вообще очень естественен. Сначала поставили "на рельсы", потом переезжаем далее. В общем случае начальное установление инварианта может быть не таким же, как последующее его восстановление.


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
В общем случае начальное установление инварианта может быть не таким же, как последующее его восстановление.


Но как правило оно именно такое же. Поэтому от ощущения дублирования кода (даже если это просто вызов функции) никак не отделаться...


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

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Конечному потребителю нужно чтобы ПО работало как положено. И вряд ли ему понравится, если Вы в угоду своим ощущениям занялись не нужной/преждевременной оптимизацией и допустили ошибку в программе.


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

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
По-моему есть четкий критерий применения LOOP. Если в WHILE невозможно однозначно определить условие выхода (нужна обработка доп. условия в теле цикла или дублирование), то, следовательно конструкция не справляется, и тогда лучше перейти к LOOP, как более адекватной.


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

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


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

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


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

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