Начинающим пользоваться FPC (переходящим с Турбо Паскаля)
Итак, в этом посте я бы хотел собрать в одном месте несколько советов для тех, кто только начинает использовать FPC, как настроить его, чтобы получать максимум пользы и минимум глюков и ошибок в программах.
I. Установка компилятора (если у вас FPC уже установлен и работает - можете пропустить этот раздел и перейти сразу к настройке)
Наконец-то настал тот день, когда вы решили перейти с доброго и надежного (но уж очень старого) Турбо/Борланд Паскаля на гораздо более современный Free Pascal. Ура! Итак, с чего же нам начать? Ну, естественно, с установки компилятора.
Заходим на страничку закачек FreePascal: Download, ищем в списке название вашей архитектуры (Intel/AMD/PowerPC, и т.д), и переходим по ссылке с названием вашей ОС. И вот теперь - внимание: читаем инструкцию перед тем, как начать скачивать пакет. Вполне может случиться так, что по той ссылке, по которой вы перешли, лежит кросс-компилятор (т.е., компилятор, позволяющий собирать программу под одной операционной системой - Host OS - для ее выполнения под другой операционной системой - Target OS). Именно это происходит при попытке скачать FPC для Win64 для AMD:
->
(обратите внимание на выделенное предупреждение: "Это пакет кросс-компилятора с i386-win32 на x86_64-win64. Перед тем, как вы сможете его использовать, вы должны установить FPC for i386-win32)
То есть, процесс выглядит так:(Показать/Скрыть)
Скачиваем 32-битную версию по ссылке, устанавливаем ее и начинаем работать, а уж потом, если есть необходимость собирать именно 64-битные программы, сверху устанавливаем кросс-компилятор, и компилируем уже с его помощью под 64 бита.
II. Настройка компилятора
Убеждаемся, что Options->Mode выставлено в Normal или в Debug, все-таки программы нужно для начала тестировать в режиме отладки, и только потом, если все работает, переключаться в Release.
Внимание: все настройки, о которых пойдет речь ниже, будут применяться ТОЛЬКО для того режима, который является текущим. То есть, если вы измените какую-то настройку для Normal, а потом переключитесь на Debug - то никакого изменения там не заметите: будут использоваться значения по умолчанию для режима Debug. Менять настройки нужно для каждого режима по отдельности (я делаю проще: меняю для Normal, и пользуюсь только им, а Debug у меня с дефолтными установками) .
Сразу же идем в Options->Compiler, и на вкладке Syntaх снимаем галочку с пункта "Allow Label and Goto" Теперь использование Goto в программах будет считаться ошибкой, и вы будете четко видеть, на что в первую очередь нужно обратить внимание в коде.
(я бы вообще снял все галочки в группе Syntax Switches для начала, если вам потом понадобятся какие-то из перечисленных "фич" - включить можно всегда) .
В этой же вкладке, Compiler Mode можно установить в "Turbo Pascal compatible", чтобы при запуске графических программ у компилятора было меньше претензий. .
Переходим на вкладку "Generated code". Здесь включаем (если они еще не включены) следующие опции:
* Range Checking (это позволит вам получать при отладке ошибки в случае выхода за пределы массивов) * Stack Checking (что позволит отлавливать переполнение стека, это очень полезно при разработке рекурсивных подпрограмм, да и для нерекурсивных тоже может помочь) * I/O Checking (контроль правильности операций ввода/вывода) * Integer Overflow Checking (контролирует результаты некоторых операций с целыми числами и генерирует ошибку при слишком большом значении результата)
Согласитесь, лучше получить эти ошибки при отладке и иметь возможность их исправить, чем допустить вылет программы при сдаче ее преподавателю или при ее запуске заказчиком, ведь ИХ настройки IDE могут отличаться от вашей... .
Теперь идем на закладку Verbose, и в группе Verbose Switches устанавливаем галочки на: * Warnings * Notes * Hints * General Info
Что это дает? Более детальную информацию об ошибках/недочетах в вашей программе. В идеале программа не должна вообще содержать не только ошибок, но и предупреждений.
Вот небольшой пример.
var i, j, value: integer;
begin { тут какой-то код, в котором не присутствуют i и j, но присутствует и изменяется value } if i > value then begin { тут опять какой-то код } end; end.
без показа Warning-ов не сообщает ни о чем, если включить отображение предупреждений - сразу получаем как минимум 2 сообщения:
test.pp(5,6) Warning: Variable "i" does not seem to be initialized test.pp(1,8) Note: Local variable "j" not used
То есть, во-первых, переменная i не была инициализирована, а во-вторых переменная j просто не используется. Сейчас многие начинающие программисты могут сказать: "А, да это мелочи, по умолчанию переменные инициализируются нулем, так что все в порядке, сообщение - лишнее". И напрасно. Не надо надеяться на автоматическую инициализацию. Я ж могу потом этот кусок программы оформить как процедуру:
procedure p; var i, j, value: integer; begin { тут какой-то код, в котором не присутствуют i и j, но присутствует и изменяется value } if i > 0 then begin { ... } end; end;
begin p; end.
Компиляция по прежнему выдаст:
ee.pp(5,8) Warning: Local variable "i" does not seem to be initialized ee.pp(2,10) Note: Local variable "j" not used
И что? Где она, ваша автоматическая инициализация? Не работает уже, в переменной i - мусор, она ж не глобальная, а локальная.
Так что не торопитесь отключать предупреждения, замечания и хинты, они могут вам еще пригодиться при удалении неиспользуемых переменных и при отлове неинициализированных... Сколько вопросов на форуме было связано с тем, что "делал в основном блоке программы - все работало, перенес в процедуру/функцию - работать перестало" - не пересчитать. Не повторяйте чужих ошибок... .
5. Что еще можно сделать для отлова ошибок - это (находясь на любой вкладке в Options->Compiler) добавить в строку Additional Compiler args:
, это позволит вам наблюдать после завершения программы отчет о количестве памяти, которую ваша программа не возвратила (это называется "утечкой", и с этим надо бороться), а если произошла ошибка - то отчет о том, в каком файле и в какой его строке находится исходный код, при выполнении которого эта ошибка произошла. Но учтите, это работает только в Debug/Normal режимах, в Release отладочная информация не генерируется, и взять данные о том, где именно произошла ошибка, неоткуда.
.
III. Настройка рабочего пространства (Desktop)
Для начала - Options->Environment->Preferences, и убеждаемся, что автосохранение выбрано не только для Environment и Desktop - файлов, но и для файлов редактора, для чего отмечаем Editor Files. Теперь перед запуском программы среда будет сохранять все исходники, и если произойдет какая-нибудь ошибка, и среду придется закрыть принудительно - вы не потеряете все внесенные изменения.
Теперь идем в Options->Environment->Desktop, и устанавливаем галочки:
History Lists (это будет сохранять список недавно открытых окон в меню File, ниже пункта Exit. Если отметку снять - то этот список сохраняться не будет, и после входа в IDE пункт File->Exit всегда будет последним. Не очень удобно) .
Watch Expressions (выбор этого пункта даст указание среде программирования сохранять также список просматриваемых в окне Watches переменных и выражений. Очень удобно при отладке - не надо каждый раз заносить заново выражения в список) .
Breakpoints (по крайней мере, я для себя этот пункт установил. Когда отлаживается какая-то программа, и мне становится временно не нужной точка останова - я ее никогда не удаляю, а просто отключаю через Debug->Breakpoint List->(правая кнопка мыши на нужной точке останова)->Toggle state, мало ли, потом опять понадобится вернуться к той же точке при тех же условиях. А поскольку обычно программа отлаживается не за одни раз, то и сохранение списка Breakpoint-ов тоже очень помогает.)
Подробнее об отладке (правда, там - для Turbo Pascal-я, но принцип работы с отладчиком остается одинаковым) - см. здесь:Отладка программ .
Open Windows (Это должно быть включено по умолчанию, но все-таки проверьте. Будут сохраняться все открытые окна, причем на тех же местах, где они были при закрытии IDE.)
Идем дальше. Переходим в Options->Environment->Editor. Здесь тоже желательно изменить как минимум два параметра:
1. Tab Size. По умолчанию установлен в 8 пробелов - но это очень много, трех/четырех символов вполне достаточно. 2. Indent Size. По умолчанию = 1, но это не совсем удобно. Лучше выставить это значение одинаковым со значением Tab Size, тогда смещение блока будет более логичным - сразу на ту же величину, на которую Tab перебрасывает строку. Чтобы изменения этих значений вступили в силу, нужно перезапустить IDE.
Я надеюсь, все знают, что такое смещение блока текста, и зачем оно нужно?(Показать/Скрыть)
А главное - как это делается? Все просто: любым способом выделяете строки текста, которые нужно сдвинуть влево/вправо. Можете "протянуть" мышкой, можете установить курсор на начало, "зажать" Shift и клавишей "курсор вниз" выделить столько строк, сколько нужно. Есть еще способ, с которого я когда-то начинал в Турбо-Паскале работу с блоками: ставим курсор на первый выделяемый символ, жмем Ctrl+K + B (отмечаем начало блока), потом курсор - на последний выделяемый символ, жмем Ctrl+K + K (отметили конец блока - он тут же выделился).
А теперь надо этот блок сместить. Просто нажимаем Ctrl+K + I (если сдвигаем вправо), или Ctrl+K + U (если влево), и весь блок сдвинулся, как видите, на величину Indent Size ( теперь вы понимаете, почему желательно, чтоб эти 2 значения совпадали? ):
, очень удобно, когда надо быстренько выровнять какой-то фрагмент кода.
3. (хотя, как справедливо заметил Lapp, это не совсем работает) но все-таки если вас раздражает автодополнение ключевых слов - отключите его в этом же диалоге: снимите галочку с "CodeComplete Enabled"
Чтобы окончательно убрать автодополнение - нужно еще зайти в "Options->Environment->CodeComplete", и в поле "Min. Length" ввести любое значение, больше длины максимального слова из списка. Самые длинные слова в списке - Implementation и ResourceString (оба длиной 14 символов), то есть, вводите Min. Length = 15, и подсказок больше не будет...
Вроде бы с настройками разобрались... Теперь осталось еще кое-что.
Настройка файлов помощи
Если вы привыкли к файлам помощи из Турбо Паскаля, и хотите их использовать и в FPC - это вполне возможно (по крайней мере, я так и делаю - для того, чтобы быстро посмотреть информацию на самые общеупотребимые процедуры/функции этого достаточно, а что посложнее - все равно придется лезть в PDF-ы или в MSDN). Просто скопируйте файлы TURBO.TPH и TVISION.TPH из папки с Турбо-Паскалем в ту папку, куда установлен FPC, зайдите в Help->Files, и по очереди добавьте эти два файла (нажатием на кнопку New). После закрытия диалога контекстная помощь будет такой же, как и в TP. Но в этом есть один недостаток - новые средства языка не отражены. Так что придется либо искать интересующую информацию в PDF-файлах, лежащих в папке \FPC\номер_версии\doc (благо, она там есть, на любой вкус), либо (если хотите и контекстную помощь именно от FPC) нужно скачать отсюда: http://www.freepascal.org/down/docs/docs-russia.html архив HTML-файлов (11 Мб), распаковать его, и добавить в Help->Files два файла: rtl\index.htm и ref\ref.html
Ну вот, вроде все о начальной настройке. Если есть вопросы (я имею в виду вопросы по настройке IDE, а не очередной холивар на тему использовать Goto или нет) - задавайте, попробуем помочь.
Отдельное спасибо Lapp-у за замечания по материалу.
Сообщение отредактировано: volvo - 28.11.2010 19:57