Переносим код из Турбо Паскаля

Перенос программ из Турбо Паскаля (графики, Turbo Vision и т.д.) в 32-битные компиляторы.

Здесь будет описание того, как портировать код со старых ТР7 программ в новые компиляторы.

  • Адаптация типов данных
  • Что делать с ассемблером
  • Как использовать графику
  • и другое

Общие рекомендации:

Чтобы программы переносились легко, надо

  • Писать их на чистом Паскале, и не смешивать их со встроенным ассемблером. Плохой пример - графика в режиме 13h с применением ассемблерных процедур
  • Применять структурное программирование: чётко разбить всё по процедурам и на модули. Желательно, всё же, использовать стандартные.
  • Не обращаться напрямую к памяти и портам.

Вопросы и ответы

Вопрос:
Как правильно портировать переменные процедурного типа из TP7 в TMT? Какие могут быть ошибки?

var pp:procedure(var x,y:integer);
 
procedure pp1(var x,y:integer);far;
begin
 
end;
 
begin
pp:=pp1;
end.

Ответ:
Вообще-то и так работать будет, но far писать излишне. Да, еще: при вызове процедур не стоит забывать никакие параметры, а то может откомпилироваться, но работать неправильно.


Вопрос:
А что делать, если в программе используется Turbo Vision?

Ответ:
Его поддерживают следующие компиляторы:

  • Free Pascal (аналог - Free Vision, fv)
  • Virtual Pascal
  • ТМТ

Особенности компиляторов

  • Free Pascal
  • TMT Pascal
  • Virtual Pascal

Free Pascal

Для совместимости с Турбо Паскалем нужно включить директиву {$MODE TP}. Если вы её не включите, компилятор будет считать тип integer как longint (одна из его особенностей) и тому подобное.

Есть демо-программы из поставки с компилятором, которые не скомпилируются и вы сразу начнёте проклинать создателей компилятора. И зря. Некоторым программам следует добавить вначале вышеупомянутую директиву {$MODE TP}, если программу спортировали из Турбо Паскаля. Другим - директиву {$MODE DELPHI}, если программу спортировали из Дельфи.

Подробности тут: $MODE : установить режим совместимости для компилятора

В TP7 часто использовал у строки нулевой элемент для определения длины.

var
 s:string;
begin
 writeln(ORD(s[o])) {вывести текущую длину строки s}
end.

или

var
 s:string;
 a: byte absolute s;
begin
 s:= 'string value';
 writeln(a) {вывести текущую длину строки s}
end.

В FPC и в Virtual Pascal этот трюк не проходит. Нужно использовать функцию length.

Пример получения длины строки в Virtual Pascal:

var
 s:string;
begin
 writeln(length(s)) {вывести текущую длину строки s}
end.

Кроме того, в Virual Pascal замечена не корректная обработка абсолютных переменных.

TMT Pascal

Ассемблер

 
pascal/upgrade_from_turbo_pascal.txt · Последнее изменение: d.m.Y H:i — papant
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki