(*) 7.2.3. Режим совместимости с Turbo Pascal

На верх  Назад  Вперёд

Если вы компилируете программу с опцией –Mtp, то компилятор будет пытаться имитировать работу компилятора Turbo Pascal следующими способами:

Назначая процедурные переменные, не требуя наличия оператора @. Одно из различий между компиляторами Turbo Pascal и Free Pascal заключается в том, что Free Pascal требует указывать символ адреса при связывании значения с процедурной переменной. В режиме совместимости с Turbo Pascal это не требуется.

Перегрузка процедур отключена. Если перегрузка процедур отключена, то нет необходимости повторять список параметров в заголовке функции.

Предварительно объявленная процедура не требует полного списка параметров, если они уже определены. В соответствии с правилами перегрузки функций в Free Pascal вы должны всегда указывать полный список параметров функции при её объявлении, даже если она была объявлена как функция с ранним связыванием, используя слово Forward. В режиме совместимости с Turbo Pascal перегрузка не функционирует, поэтому вы можете пропустить список параметров:
 
Procedure a (L : Longint); Forward;
 ...
 
Procedure a; {Нет необходимости повторять (L : Longint)}
 begin
   ...
 end;
 

Вызовы рекурсивных процедур обрабатываются различно. В следующем примере:
 
Function expr : Longint;
 begin
   ...
  Expr:=L;
   Writeln(Expr);
   ...
 end;
 
в режиме совместимости Turbo Pascal функция будет вызвана рекурсивно, когда будет выполняться оператор Writeln. В Free Pascal результатом функции будет вывод значения на экран. Чтобы рекурсивно вызвать функцию в Free Pascal, исходный код должен быть таким:
 
Function expr : Longint;
 begin
   ...
  Expr:=L;
  Writeln(Expr());
  ...
end;
 
Любой текст после завершающего оператора End. будет игнорироваться. В нормальном режиме этот текст также выполняется.

Вы не можете назначать процедурные переменные нетипизированным указателям. Следующий пример неправлильный:
 
a: Procedure;
b: Pointer;
begin
 b := a; // Будет сгенерирована ошибка.
 

Оператор @ нужно печатать, если применяются процедурные переменные.

Не допускаются вложенные комментарии.

ПРИМЕЧАНИЕ

Функции MemAvail и MaxAvail больше недоступны в Free Pascal версии 2.0 и выше. Причина этой несовместимости следующая: на современных операционных 1 The DOS extender GO32V2 falls under this definition of ”modern” because it can use paged memory and run in multitasked environments.

DOS расширитель GO32V2 подпадает под это определение "современный", потому что он может использовать выгружаемый и запустить в multitasked средах.
системах вопрос «Доступной свободной памяти» не актуален для приложений по следующим причинам:

1.Процессор запрашивает у ОС, сколько памяти нужно приложению. Другие приложения могут разместиться в любом месте памяти.

2.Понятие «свободная память» включает в себя не только свободную оперативную память, но и место на диске (файл подкачки, размер которого можно изменить), а также память, распределённую под другие приложения, но не используемую ими, которую можно временно занять.

По этой причине программы, которые используют функции MemAvail и MaxAvail, должны быть переписаны таким образом, чтобы не использовать эти функции. Сделать это можно тремя способами:

1.Использовать исключения для отслеживания ситуаций нехватки памяти.

2.Установить глобальную переменную ReturnNilIfGrowHeapFails в значение TRUE и проверять после каждого выделения памяти, что указатель не равен Nil.

3.Не заботиться о выделении памяти и просто объявить функцию MaxAvail, которая всегда будет возвращать High(LongInt) или другую подобную константу.