Значение константы из функции

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Значение константы из функции

Сообщение Vadim »

В модуле мне нужно определить значения констант из функции. Причём функция определена в этом же модуле.

Код: Выделить всё

function f(p1,p2: integer): integer;

Const
  const1 = f(1,2);
  const = f(3,4);


Как это правильно сделать? В таком виде компилятор выдаёт ошибку "Illegal expression".
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

Константы назначаются при компиляции. Можно использовать только функции препроцессора (макросы)
https://www.freepascal.org/docs-html/prog/progse5.html

Добавлено спустя 5 минут 32 секунды:
Однако, можно разрешить запись в констаты директивой {$J} или {$WriteableConst}
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Понятно. Попробую тогда с макросами поиграть...
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Типизированные константы вполне себе допускают присваивание, если {$WRITEABLECONST ON}.

Код: Выделить всё

const
  MyInt: Integer = 0;
  .....................
{$PUSH}{$J+}
  MyInt := -1;
{$POP}

должно работать.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

iskander писал(а):Типизированные константы вполне себе допускают присваивание

Это в процессе работы программы. А там мне как раз присваивать константам ничего не надо, только при их объявлении нужно получить определённое вычисляемое значение, т.к. оно основано на типизированных значениях из другого модуля и те другие вполне могут поменяться. Поэтому лучше использовать не сами значения, а их имена в системе.
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

Vadim писал(а):

Код: Выделить всё

function f(p1,p2: integer): integer;

Const
  const1 = f(1,2);
  const = f(3,4);


Как это правильно сделать? В таком виде компилятор выдаёт ошибку "Illegal expression".

Во втором объявлении ключевое слово const используется в качестве идентификатора. Взял ваш пример в качестве постановки по двухстадийной компиляции в Халва-Паскале, второе объявление исправил на const2.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Vapaamies писал(а):Во втором объявлении ключевое слово const используется в качестве идентификатора.

Это была непропечатка клавы... ;-) На самом деле там должно быть как раз "const2".
Ответить