OberonCore
https://forum.oberoncore.ru/

ZipInflate под Bluebottle (A2)
https://forum.oberoncore.ru/viewtopic.php?f=22&t=1211
Страница 1 из 2

Автор:  Штирлиц [ Понедельник, 20 Октябрь, 2008 11:55 ]
Заголовок сообщения:  ZipInflate под Bluebottle (A2)

Вопрос к знатокам Bluebottle (A2).
А под A2 ZipInflate нормально работает?
Нет ли проблем при распаковке файлов длиной > 32768 байт?

Автор:  Ярослав Романченко [ Понедельник, 20 Октябрь, 2008 19:48 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

Провёл простейший тест.
Извлёк содержимое 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 байт соответственно. Всё работает. Проблемы похоже нет.

Автор:  Штирлиц [ Среда, 22 Октябрь, 2008 08:13 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

Нашёл, где ошибка
Ошибка в 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) - она тоже есть

Автор:  Info21 [ Среда, 22 Октябрь, 2008 09:14 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

Штирлиц писал(а):
Нашёл, где ошибка

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

Автор:  bohdant [ Среда, 22 Октябрь, 2008 09:31 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

Штирлиц писал(а):
Нашёл, где ошибка

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

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


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

Автор:  Ярослав Романченко [ Среда, 22 Октябрь, 2008 10:06 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

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 КБ | Просмотров: 15550 ]

Автор:  Info21 [ Среда, 22 Октябрь, 2008 10:34 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

bohdant писал(а):
А LOOP тут не причем, как мне кажется, просто код запутанный и скорее всего когда портировали лажанулись.

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

Автор:  Info21 [ Среда, 22 Октябрь, 2008 10:35 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

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

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

Автор:  Ярослав Романченко [ Среда, 22 Октябрь, 2008 10:38 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

Info21 писал(а):
Если бы пришлось переделывать на дейкстровский while, ошибка сразу вылезла бы.
Если-бы создавалось на ДРАКОНе ошибка и не закралась бы вовсе.

Автор:  Штирлиц [ Среда, 22 Октябрь, 2008 11:15 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

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


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

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

Автор:  AVC [ Среда, 22 Октябрь, 2008 11:20 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

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.

Автор:  Ярослав Романченко [ Среда, 22 Октябрь, 2008 11:27 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

bohdant писал(а):
Штирлиц писал(а):
Нашёл, где ошибка
Неплохо бы закаинуть в Bug Report http://www.ocp.inf.ethz.ch/forum/index.php/board,7.0.html
Не неплохо-бы, а очень нужно! :)
Автор не желает сообщить про баг? :)

Автор:  Info21 [ Среда, 22 Октябрь, 2008 11:31 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

AVC писал(а):
Есть вариант
Код:
PROCEDURE loop;
BEGIN
  block1;
  WHILE ~cond DO
    block2;
    block1
  END
END loop
Его минус - дублирование block1.

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

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

Автор:  Штирлиц [ Среда, 22 Октябрь, 2008 11:51 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

Ярослав Романченко писал(а):
Автор не желает сообщить про баг? :)

Отписал

Автор:  AVC [ Среда, 22 Октябрь, 2008 12:15 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

Info21 писал(а):
Ради экзотики усложнять всю жизнь?
Во-первых, такая ли уж это экзотика?
А во-вторых, все-таки дублирование кода. :)

Автор:  Trurl [ Среда, 22 Октябрь, 2008 12:44 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

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;

Автор:  Илья Ермаков [ Среда, 22 Октябрь, 2008 15:40 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

По-моему, если ощущать цикл как "езду по рельсам инварианта", то вариант с WHILE вообще очень естественен. Сначала поставили "на рельсы", потом переезжаем далее. В общем случае начальное установление инварианта может быть не таким же, как последующее его восстановление.

Автор:  Vlad [ Среда, 22 Октябрь, 2008 16:07 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

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


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

Автор:  Евгений Темиргалеев [ Среда, 22 Октябрь, 2008 17:58 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

Конечному потребителю нужно чтобы ПО работало как положено. И вряд ли ему понравится, если Вы в угоду своим ощущениям занялись не нужной/преждевременной оптимизацией и допустили ошибку в программе.

Автор:  Axcel [ Среда, 22 Октябрь, 2008 18:15 ]
Заголовок сообщения:  Re: ZipInflate под Bluebottle (A2)

По-моему есть четкий критерий применения LOOP. Если в WHILE невозможно однозначно определить условие выхода (нужна обработка доп. условия в теле цикла или дублирование), то, следовательно конструкция не справляется, и тогда лучше перейти к LOOP, как более адекватной.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/