====== Переносим код из Турбо Паскаля ======
Перенос программ из Турбо Паскаля (графики, 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 ====
* [[FAQ:pas32:FPC-Graph|Графика в FPC, модуль Graph]]
Для совместимости с Турбо Паскалем нужно включить директиву {$MODE TP}. Если вы её не включите, компилятор будет считать тип integer как longint (одна из его особенностей) и тому подобное.
Есть демо-программы из поставки с компилятором, которые не скомпилируются и вы сразу начнёте проклинать создателей компилятора. И зря. Некоторым программам следует добавить вначале вышеупомянутую директиву {$MODE TP}, если программу спортировали из Турбо Паскаля. Другим - директиву {$MODE DELPHI}, если программу спортировали из Дельфи.
Подробности тут: [[http://freepascal.ru/wiki/index.php/%24MODE_:_%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC_%D1%81%D0%BE%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D0%B0|$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 ====
* [[FAQ:pas32:TMT-Graph|Модуль Graph в TMT]]
===== Ассемблер =====
* [[FAQ:pas32:asm32|Изменение на 32-битный ассемблер]]