OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 22:28

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




Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 17 Сентябрь, 2010 19:16 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Напоролся на ошибку из-за следующего нюанса:
- явное приведение к LONGINT делает константу соотв. типа
- ожидал, что константа, вычисляемая с участием LONGINT-константы тоже будет LONGINT. Однако, если результат влезает в INTEGER, компилятор берёт его.
Код:
MODULE Test_const_type;

    IMPORT Log := StdLog;
   
    PROCEDURE Do*;
        CONST
            c1 = LONG(2);
            c2 = c1 * 1024;
            c3 = LONG(c1 * 1024);
        VAR
            a: INTEGER;
            x: LONGINT;
    BEGIN
        a := MAX(INTEGER);
        x := c1 * a;
        Log.Int(x); Log.Ln;
        x := c2 * a;
        Log.Int(x); Log.Ln;
        x := c3 * a;
        Log.Int(x); Log.Ln
    END Do;
   
END Test_const_type.

^Q Test_const_type.Do
Log писал(а):
4294967294
-2048
4398046509056


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 14:37 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
В XDS не смог воспроизвести: компилятор вылетает с ошибкой при попытке скомпилировать строку LONG (constant expression).
http://www.excelsior-usa.com/forum/inde ... pic=1950.0


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 16:04 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Фича! Однозначно фича! :)

Можно, кстати, глянуть, что там на самом деле компилятор вытворяет (если у кого времени много). Тогда будет точно ясно что это.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 16:18 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Меня больше интересует трактовка в определении языка.
Цитата:
5. Constant Declarations
...
A constant expression is an expression that can be evaluated by a mere textual scan without actually executing the program. Its operands are constants (Ch.8) or predeclared functions (Ch.10.3) that can be evaluated at compile time...
И я понимаю его как "constant expression" эквивалентна expression, который считает компилятор. А эквивалентность означает, что результаты операций должны быть такие же как были бы для переменных при выполнении кода. Т.е. LONGINT.
Цитата:
operator first operand second operand result type
+ - * DIV MOD <= INTEGER <= INTEGER INTEGER
integer type integer type LONGINT
Склоняюсь к мнению, что это ошибка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 17:11 
Аватара пользователя

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

Сообщение о языке Компонентный Паскаль писал(а):
3. Словарь и изображение
...
Типом целой константы является INTEGER, если значение константы принадлежит диапазону значений типа INTEGER ...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 18:23 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Info21 писал(а):
Сообщение о языке Компонентный Паскаль писал(а):
3. Словарь и изображение
...
Типом целой константы является INTEGER, если значение константы принадлежит диапазону значений типа INTEGER ...
Но речь то там идёт про терминальные лексемы, а не про константные выражения. В примере выше именованная константа, тип которой определяется типом выражения...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 18:42 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Тема поднята с целью классифицировать сей феномен:
- если это баг - будет типа пометка на исправление
- если фича - то о ней надо сделать заметку в определении языка. Аналогично
Цитата:
Note:
(-5) DIV 3 = -2
but
-5 DIV 3 = -(5 DIV 3) = -1


Из-за этой баго-фичи я ошибку в модуле не мог найти. Математика безупречна, а местами - хрен поймёт что получалось. Через полгода полез повторно - и докопался. Да и то, скорее случайно, чем осознанно...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 18:59 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Согласен, что угол недостаточно освещён.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 

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


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

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


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

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