Перенос программ из Турбо Паскаля (графики, Turbo Vision и т.д.) в 32-битные компиляторы.
Здесь будет описание того, как портировать код со старых ТР7 программ в новые компиляторы.
Чтобы программы переносились легко, надо
Вопрос:
Как правильно портировать переменные процедурного типа из 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?
Ответ:
Его поддерживают следующие компиляторы:
Для совместимости с Турбо Паскалем нужно включить директиву {$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 замечена не корректная обработка абсолютных переменных.