====== Переносим код из Турбо Паскаля ====== Перенос программ из Турбо Паскаля (графики, 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-битный ассемблер]]