OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 04 Май, 2007 12:09 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
Модератор: заголовок темы поправлен, чтобы присутствовало слово "переполнение"
Почему зависает BlackBox? Вот от такой программы:

Код:
PROCEDURE Test*;
   VAR b: BYTE;
BEGIN
   ASSERT(MIN(BYTE) = -128);
   ASSERT(MAX(BYTE) = 127);
   FOR b := MIN(BYTE) TO MAX(BYTE) DO
   END
END Test;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 04 Май, 2007 13:10 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1429
По определению ;)
Код:
b := MIN(BYTE);
WHILE b <= MAX(BYTE) DO INC(b, 1) END;
ASSERT(b > MAX(BYTE))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 04 Май, 2007 14:09 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
понятно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 23 Май, 2007 11:50 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
А разве по правилам ББ не должна здесь быть проверка на выход за границы диапазона?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 24 Май, 2007 09:21 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Насколько мне известно, стандарт языка этого не предусматривает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Переполнение целых и цикл FOR
СообщениеДобавлено: Среда, 28 Октябрь, 2009 00:28 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Модератор: прикреплено к уже существующей теме.
Сначала показалось не может быть:
Код:
PROCEDURE Do*;
   VAR j, N: INTEGER;
BEGIN
   N := ORD({0..30});
   FOR j := 1 TO N DO
      ASSERT(j > 0, 20);
   END;
END Do;

Если переписать через WHILE, конечно, все становится понятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переполнение целых и цикл FOR
СообщениеДобавлено: Среда, 28 Октябрь, 2009 03:22 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
почему было не взять N=MAX(INTEGER)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переполнение целых и цикл FOR
СообщениеДобавлено: Среда, 28 Октябрь, 2009 10:26 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Опция компилятора allchecks по умолчанию отключена.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переполнение целых и цикл FOR
СообщениеДобавлено: Среда, 28 Октябрь, 2009 10:56 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переполнение целых и цикл FOR
СообщениеДобавлено: Среда, 28 Октябрь, 2009 23:16 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Действительно, те же грабли :P
Info21 писал(а):
почему было не взять N=MAX(INTEGER)?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 29 Октябрь, 2009 11:08 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
В ГБ то же что и в ЧЯ. Думаю, что код одинаков.
Дело в том, что в отличии, например, от Делфи (в Си FOR другой и там глядеть нету смысла)
Цикл ГБ/ЧЯ устроен так:
сравнивается текущее значение переменной цикла и с указанным значением в TO и если значение больше (JNLE) выходим из цикла (т.е. в сучае MAX(INTEGER) и т.п. будем ходить по круга, т.к. значение никогда не будет больше максимального!!!)

Цикл в делфи устроен так:
сравнивается текущее значение переменной цикла и с инкриментированным на единицу указанным значением в TO и если не равны, продолжаем выполнение цикла

Цикл в FreePascal устроен так(мне больше всего понравилось реализация):
сравнивается текущее значение переменной цикла и с указанным значением в TO и если значение меньше (JL) , продолжаем выполнение цикла

Как по мне правильно сделано в FPC, подводных камней не вижу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 29 Октябрь, 2009 11:39 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Так в FPC как раз и получился нормальный WHILE i < max DO :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 29 Октябрь, 2009 11:43 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Илья Ермаков писал(а):
Так в FPC как раз и получился нормальный WHILE i < max DO :)

Наверное и в обероне нужно так сделать :wink:

там еще до цикла проверочка на диапазон стоит, т.к. в цикле проверка WHILE i < max стоит в конце


Последний раз редактировалось bohdant Четверг, 29 Октябрь, 2009 11:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 29 Октябрь, 2009 11:46 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Я вот просто забил, наконец, на FOR. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 29 Октябрь, 2009 11:48 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Но сколько людей еще должны нарватся на эту фичу компиллера? :lol:
я уже не нарвусь :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 02:36 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Илья Ермаков писал(а):
Так в FPC как раз и получился нормальный WHILE i < max DO :)

Не понятно, такой WHILE ведь эквивалентен FOR i=.., MAX(INTEGER)-1 и проблемы не представляет?
Или предлагается изменить смысл FOR? Но тогда кто мешает написать FOR i=.., MAX(INTEGER)+1?

Интересно, что проблемы действительно нет в gpcp: там выскакивает exception. Если в ББ включить allchecks видимо будет то же самое?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 09:57 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Chris Burrows все объяснил, причем ткнул носом в доку :oops:
Оператор

FOR v := beg TO end BY step DO statements END

эквивалентен

temp := end; v := beg;
IF step > 0 THEN
WHILE v <= temp DO statements; v := v + step END
ELSE
WHILE v >= temp DO statements; v := v + step END
END

т.е. зависон докуменирован.
igor писал(а):
Опция компилятора allchecks по умолчанию отключена.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 30 Октябрь, 2009 10:00 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
QWERTYProgrammer писал(а):
Или предлагается изменить смысл FOR?

нет, там все правильно работает
Код:
CMP [startval],stopval
JG exit            ;JNG
DEC [startval]

loop:
INC [startval]
...
...
...
CMP [startval],stopval
JL loop            ;JNL
exit:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Ноябрь, 2009 00:40 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Кстати, если компилировать с allchecks, то при умножении MAX(INTEGER) на 2 почему-то ББ ошибки переполнения не выдает. При умножении на 3 или при сложении с 1 ошибка, как и должно, быть возникает :evil:
Код:
PROCEDURE Do*;
   VAR i, N: INTEGER;
BEGIN
   N := MAX(INTEGER);
   Log.Int(N); Log.Tab; Log.Set(BITS(N)); Log.Ln;
   i := N * 2;
   Log.Int(i); Log.Tab; Log.Set(BITS(i)); Log.Ln;
   i := N * 3;
   Log.Int(i); Log.Tab; Log.Set(BITS(i)); Log.Ln;
   i := N + 1;
   Log.Int(i); Log.Tab; Log.Set(BITS(i)); Log.Ln;
END Do;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Ноябрь, 2009 00:44 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
ASH(N,...) тоже проходит без ошибки.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ] 

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


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

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


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

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