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

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

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

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

Сообщение fpbt » 21.07.2014 11:50:17

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

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

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

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

Сообщение Дож » 21.07.2014 12:33:21

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. Есть ли способы вычислять "сложные" константы на этапе компиляции? (Например возведение в степень "**")

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

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

Сообщение Tango » 08.08.2014 11:01:50

Можно вычислять сложные константы, была тут такая тема, и там показали что вычисляются.
Аватара пользователя
Tango
постоялец
 
Сообщения: 156
Зарегистрирован: 31.05.2012 17:07:30

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

Сообщение Дож » 10.08.2014 14:21:36

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

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

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

Сообщение Sergei I. Gorelkin » 10.08.2014 15:17:13

В версии 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.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение hinst » 10.08.2014 17:55:22

вот это прогресс, но имхо фича не то чтобы очень нужная, умвр и так
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

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

Сообщение sign » 11.08.2014 06:42:09

Отчего ж не так уж и нужная!
Весьма удобно присваивать константе не некую цифирь, а вполне себе осмысленное выражение.
Что б через год (или кто чужой) глянул, и всё понял.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53


Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru