Вопросы по компилятору

Форум для изучающих FPC и их учителей.

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

Ответить
fpbt
новенький
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

Вопросы по компилятору

Сообщение fpbt »

Здравствуйте.

1. Почему для цикла for нельзя использовать переменную типа Int64/UInt64

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

...
 Var
    i: Int64;
...
 Begin
  ...
   for i := 1 to ...
  ...
 End;
...

2. Есть ли способы вычислять "сложные" константы на этапе компиляции? (Например возведение в степень "**")

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

...
 Const
    cTest1: Int64 = 7**12;
...


lazarus 1.2.4_win 32_fpc 2.6.4

Спасибо.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

1. Почему для цикла for нельзя использовать переменную типа Int64/UInt64

Можно в 64 битных системах, нельзя в 32 битных. Вероятно, связано с тем, что переменная простого цикла for должна умещаться в регистр. Можно попытаться сделать как-то цикл через for-in:

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

{$MODE OBJFPC}
type
  D = 0..10;

var
  I: Int64;

begin
  for I in D do
    Writeln(I);
end.


2. Есть ли способы вычислять "сложные" константы на этапе компиляции? (Например возведение в степень "**")

Средствами языка — нет, только препроцессорами.
Аватара пользователя
Tango
постоялец
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Сообщение Tango »

Можно вычислять сложные константы, была тут такая тема, и там показали что вычисляются.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Можно вычислять сложные константы, была тут такая тема, и там показали что вычисляются.

Тему в студию.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

В версии 2.7.1 на этапе компиляции вычисляются все состоящие из констант простые выражения, а также встроенные функции (sin,cos,exp,ln). Возведение в степень оператором ** тоже вычисляется. Кроме того, вычисляются и inline функции, тело которых является одиночным выражением:

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

function packFloat64( zSign: flag; zExp: int16; zSig : bits64): float64;inline;
begin
    result := float64(( ( bits64(zSign) ) shl 63 ) + ( ( bits64(zExp) ) shl 52 ) + zSig);
end;

begin
  x:=packfloat64(0,0,0);   // скомпилируется как "x:=0"
end.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

вот это прогресс, но имхо фича не то чтобы очень нужная, умвр и так
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Отчего ж не так уж и нужная!
Весьма удобно присваивать константе не некую цифирь, а вполне себе осмысленное выражение.
Что б через год (или кто чужой) глянул, и всё понял.
Ответить