OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 23 Апрель, 2024 15:38

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 07 Октябрь, 2010 10:29 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Мне не понятен один момент, почему при создании символьного файла туда сохраняются ЗНАЧЕНИЯ констант. Если значение константы в импортированном модуле поменяется, то надо перекомпилировать и тот модуль, который его импортирует. Почему бы не сохранять в символьный файл просто название константы и место, в объектом файле, где оно храниться, тогда если константа измениться, модуль который его импортирует не потребует перекомпиляции.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Дело в том, что в каждый модуль, где используется константа, её значение внедряется при компиляции. Иногда уже в неявном, вычисленном виде.

Например:

x := 2* MyMath.pi - компилятор возьмёт значение константы pi из модуля MyMath, умножит на 2 и в ваш модуль запишет прямо в код результат. А ссылка на константу другого модуля вставляется именно затем, чтобы отследить, если она поменялась, и потребовать от программиста перекомпиляции. Вообще, раз введённые константы менять не следует.

Если же Вам это нужно, то это по смыслу уже не константа, а то, что в других языках часто называется константной переменной.

Делается так:

Код:
MODULE Demo;

  CONST
    _myVal = 10;

  VAR
    myVal-: INTEGER;

BEGIN
  myVal := _myVal
END Demo;


Практический пример: есть константы с обозначениями валют. Они неизменны, но могут появляться новые. Удобно иметь величину, которая хранит максимальную существующую константу валюты (для разных переборов).

Код:
  CONST
    wmz* = 101; wmr* = 102; wmb* = 103; ...
    _lastWm = 103;
   VAR
     lastWm-: INTEGER


Тогда во внешних модулях можно спокойно, устойчиво к любому добавлению констант, перебирать:

Код:
i := Types.wmz;
WHILE i <= Types.lastWm DO
  ...
  INC(i)
END


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Октябрь, 2010 12:29 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Спасибо за ответ.


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

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


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

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


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

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