Не могу использовать константы при объявлени констант!Пошто?

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

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

Ответить
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Не могу использовать константы при объявлени констант!Пошто?

Сообщение Cheb »

FPC 2.6.4

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

 type
  fixed32 = packed record
    i: longint;
  end;
  const
     FF_ZERO: fixed32 = (i: 0);
     FF_ONE: fixed32 = (i: 1 shl 16);
     FF_MINUS_ONE: fixed32 = (i: - (1 shl 16));
     FF_ONE_PERCENT: fixed32 = (i: 655);
     FF_ONE_THOUSANDTH: fixed32 = (i: 66);
 type
   TffVector = packed record
     x, y, z: fixed32;
   end;


Затем, пытаюсь

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

  const
    ForwardVector: TffVector = (x: FF_ZERO; y: FF_ZERO; z: FF_MINUS_ONE);


- и хрен :evil:
Fatal: Syntax error, "(" expected but "identifier FF_ZERO" found

:evil: :evil: :evil:
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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

Т.к. сие поведение рудимент старых версий паскаля (где нельзя было присвоить значение переменной, в момент её объявления), то возможно и появится какая-нибудь хитрая директива компилятора, чтобы типизированные константы были константами. Т.е. значение в run-time уже не поменять, зато в константных выражениях можно будет использовать.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

А почему в константных выражениях их нельзя использовать прямо сейчас?
Для этого ведь нужно, чтобы во время компиляции значение было известно, ну так оно известно.
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

Ясно.

Но это, пожалуй, главная гляняная нога языка, ИМО. :(

Я просто надеялся, что за столько лет, такую позорную дырку, уже заткнули.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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

а фиг его знает почему. Чтобы люди не баловались ногой и пистолетом?
Особенно в тех случаях, где типизированная константа используется в качестве глобальной переменной (вроде старых модулей)?
Почему бы не создать feature request? ;)

Кстати "официальная" позиция FPC разработчиков :) - "это не типизированные консатны плохие, это плохо использованные имя". Разумно!

Сюда же можно припомнить использование истинных функций в константых выражениях.

Cheb писал(а):Я просто надеялся, что за столько лет, такую позорную дырку, уже заткнули.

используй секцию инициализации :)

Либо так:

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

type
  fixed32 = packed record
    i: longint;
  end;
  const
     _FF_ZERO = 0;
     FF_ZERO: fixed32 = (i: _FF_ZERO);
     _FF_MINUS_ONE = - (1 shl 16);
     FF_MINUS_ONE: fixed32 = (i: _FF_MINUS_ONE);
type
   TffVector = packed record
     x, y, z: fixed32;
   end;

  const
    ForwardVector: TffVector = (x: (i:_FF_ZERO); y: (i:_FF_ZERO); z: (i:_FF_MINUS_ONE));


Добавлено спустя 6 минут 20 секунд:
Re: Не могу использовать константы при объявлени констант!Пошто?
на худой конец, можно пойти самым неверным путём :mrgreen:
Но большой плюс (и предохранитель на тот самый пистолет), это ограничение объявленным модулем. Если конечно не Сионизироваться дальше и переходить от uses к {$include}-ам :mrgreen: :mrgreen:

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

{$macro on}
type
  fixed32 = packed record
    i: longint;
  end;
  const
{$define _FF_ZERO:=(i: 0)}
     FF_ZERO: fixed32 = _FF_ZERO;
     FF_ONE: fixed32 = (i: 1 shl 16);
{$define _FF_MINUS_ONE:=(i: - (1 shl 16))}
     FF_MINUS_ONE: fixed32 = _FF_MINUS_ONE;
     FF_ONE_PERCENT: fixed32 = (i: 655);
     FF_ONE_THOUSANDTH: fixed32 = (i: 66);
type
   TffVector = packed record
     x, y, z: fixed32;
   end;
const
    ForwardVector: TffVector = (x: _FF_ZERO; y: _FF_ZERO; z: _FF_MINUS_ONE);
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

самым неверным путём :mrgreen:

Угх. Я только-только от стад макросов в коде избавился. >_< Блокировали автозавершение и Ctrl-щелчок в Лазарусе.

Пойду первым путём, спасибо за совет. Что-то я последнее время тугодумный.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

Ребят, нет новостей, появилось ли решение на уровне компилятора и без макросов?

Большое спасибо.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

wavebvg писал(а):Ребят, нет новостей, появилось ли решение на уровне компилятора и без макросов?

Большое спасибо.
Так вроде выше Скалогрыз предложил решение без макросов .

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

  const
    ForwardVector: TffVector = (x: (i:_FF_ZERO); y: (i:_FF_ZERO); z: (i:_FF_MINUS_ONE));
Не совсем понял как это работает но если работает то в чем проблема ? :roll:
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

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

{$define _FF_MINUS_ONE:=(i: - (1 shl 16))}
Это Макро команда.

Выходит неудобно, когда нужно сделать полностью декларативное решение и не хочется городить дизайн тайма.
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

wavebvg, там же скалогрыз писал, используй инициализацию в модуле.
Разницы нет практически ни какой.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

Seenkao -- это возможно только в случае использования именованных констант (зачёркнуто) переменных. Передать неименованную переменную не получится. Пришлось использовать object-ы вместо record-ов с наследованием, вместо делегирования.
Ответить