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: Не могу использовать константы при объявлени констант!Пошто?на худой конец, можно пойти самым
неверным путём
Но большой плюс (и предохранитель на тот самый пистолет), это ограничение объявленным модулем. Если конечно не Сионизироваться дальше и переходить от uses к {$include}-ам
- Код: Выделить всё
{$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);