Почему программа не работает?
(заметки для [почти] профессионалов)
Этот раздел является переводом фрагмента "Ingemar's guide to Think Pascal 4.5d4"
Существует несколько "ловушек", в которые можно попасть, начиная программировать на Макинтош в среде THINK Pascal.
- Иногда Вы будете получать сообщение об ошибке "segment too large" (Сегмент слишком большой). Если это случилось, щелкнув картинку "пирамидка" в окне проекта, переключитесь в "segment view" (По сегментам). Теперь можно перемещать файлы между сегментами кода. Вкратце, ваша задача -- добиться, чтобы размер каждого сегмента не превышал 32k.
- Отладочный "механизм" в Think Pascal не гарантирует правильность работы при прерываниях (not interrupt-safe), так что при вызове процедур VBL, Time Manager, Device Manager или обращениях к файловой системе, вставьте в программу директивы компилятора
{$Push} {$D-} (Сохранить текущие параметры компиляции. Отключить режим отладки) перед вызовом и
{$Pop} (Восстановить параметры компиляции) после него.
- Практически невозможно отладить процедуры трекинга Drag Manager'а под Think Pascal из-за особенностей работы Drag Manager'а. (Даже не пытайтесь -- ваш компьютер зависнет наглухо). Их придется отлаживать отдельно, с помощью Macsbug. Тем не менее, можно отладить receive handlers.
- Сложно отладить под Think Pascal код Apple Event, поскольку при переключении Think Pascal в фоновый режим, программа пользователя приостанавливается и не отвечает на Apple Events. Тем не менее, если удастся сделать тестовую систему таким образом, чтобы программа передавала Apple Events самой себе, либо передавать Apple Events с другого компьютера, Think Pascal исправно передаст все полученные события работающей программе.
Есть еще одна скверная вещь, о которой Вам необходимо знать: приложение, полученное в результате компоновки исправно работавшей под THINK Pascal программы, отказывается работать. Это может поставить новичка в тупик. Не расстраивайтесь! Вот возможные причины:
- Небрежная отношение к графическому порту. Под Think Pascal по умолчанию графический порт настраивается на окно "Drawing". В независимом приложении правило умолчания не действует, поэтому проверьте, чтобы процедура SetPort корректно указывала на окно.
- Think Pascal автоматически инициализирует Toolbox. Если Вы выполните то же самое еще и вручную -- неминуемы проблемы. Нужно либо запретить автоматическую инициализацию
{$I-}, либо исключить из программы соответствующие команды.
- Если Вы выделили программе много памяти в Параметрах Исполнения (Run options), но не включили ресурс SIZE с соответствующими параметрами в готовую программу, возможно переполнение памяти (out of memory).
- Наконец, возможна еще одна проблема, не связанная со средой разработки. Если производятся действия за пределами диапазона индексов массива либо по ошибочному указателю, будут возникать непредсказуемые ошибки. Контроль диапазонов поможет обнаружить некоторые ошибки, однако ошибки с использованием указателей придется выявлять самостоятельно. Проверяйте, возвращает ли процедура NewPtr/NewHandle/GetResource и т.п. nil, прежде чем использовать результат. Когда данные перестают требоваться, устанавливайте указатель/хэндл на уничтоженную переменную в nil.
|