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

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

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

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

Сообщение Cheb » 06.06.2015 15:29:32

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:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

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

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

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

Т.к. сие поведение рудимент старых версий паскаля (где нельзя было присвоить значение переменной, в момент её объявления), то возможно и появится какая-нибудь хитрая директива компилятора, чтобы типизированные константы были константами. Т.е. значение в run-time уже не поменять, зато в константных выражениях можно будет использовать.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Mirage » 06.06.2015 23:40:46

А почему в константных выражениях их нельзя использовать прямо сейчас?
Для этого ведь нужно, чтобы во время компиляции значение было известно, ну так оно известно.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение Cheb » 07.06.2015 03:02:22

Ясно.

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

Я просто надеялся, что за столько лет, такую позорную дырку, уже заткнули.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

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

Сообщение скалогрыз » 07.06.2015 06:19:07

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);
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Cheb » 08.06.2015 01:02:59

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

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

Пойду первым путём, спасибо за совет. Что-то я последнее время тугодумный.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

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

Сообщение wavebvg » 26.08.2022 12:54:22

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

Большое спасибо.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

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

Сообщение Alex2013 » 26.08.2022 13:09:07

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

Большое спасибо.

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


Код: Выделить всё
  const
    ForwardVector: TffVector = (x: (i:_FF_ZERO); y: (i:_FF_ZERO); z: (i:_FF_MINUS_ONE));


Не совсем понял как это работает но если работает то в чем проблема ? :roll:
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение wavebvg » 26.08.2022 15:15:39

Код: Выделить всё
{$define _FF_MINUS_ONE:=(i: - (1 shl 16))}


Это Макро команда.

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

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

Сообщение Seenkao » 27.08.2022 02:02:41

wavebvg, там же скалогрыз писал, используй инициализацию в модуле.
Разницы нет практически ни какой.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

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

Сообщение wavebvg » 30.08.2022 13:25:09

Seenkao -- это возможно только в случае использования именованных констант (зачёркнуто) переменных. Передать неименованную переменную не получится. Пришлось использовать object-ы вместо record-ов с наследованием, вместо делегирования.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru