Читайте также: |
|
Помимо описанных команд компиляции имеется еще две: Project | Compile All Projects и Project | Build All Projects. Они подобны рассмотренным командам Compile и Build, но при работе с группой проектов относятся не к одному, а ко всем проектам группы.
Сообщения компилятора.
В предыдущем разделе рассмотрены команды компиляции проекта. Теперь посмотрим, какие сообщения об ошибках и какие предупреждения выдает компилятор и как на них надо реагировать. Давайте для этого сделаем простое приложение с ошибочными операторами. Начните новое приложение, перенесите на форму метку Label и кнопку Button. В обработчике щелчка кнопки введите следующие операторы:
procedure TForm1.Button1Click(Sender: TObject);
Var
i,j:integer;
A:double;
Begin
for i:=1 to 50 do
A:=A*10000;
Label1.Caption:='A= '+B;
End;
Попробуйте выполнить команду Run | Run, или нажать соответствующую быструю кнопку, или нажать клавишу F9. Вы увидите в окне Редактора Кода картину, показанную ниже
Внизу окна видны сообщения о замечаниях и ошибках. Прежде, чем рассматривать их, отметим, что они размещены во встраиваемом окне сообщений. Как всякое встраиваемое окно, вы можете вынуть его из Редактора Кода и сделать самостоятельным или встроить, например, в окно Инспектора Объектов. Если вы вынули окно сообщений из окна Редактора Кода, а при дальнейших манипуляциях с окнами «потеряли», или если вы закрыли это окно его системной кнопкой с крестиком, то вы можете щелкнуть в окне Редактора Кода правой кнопкой мыши и выбрать в контекстном меню команду Message View.
Теперь рассмотрим полученные сообщения компилятора. Первое сообщение:
[Error] Unit1.pas(35): Undeclared identifier: 'B'
([Ошибка] модуль Unit1.pas строка 35: Необъявленный идентификатор ‘В’)
Это сообщение об ошибке. В данном случае вместо переменной А мы указали переменную В, которая не была объявлена. Строка кода с этой ошибкой выделена в окне Редактора Кода и курсор остановился около необъявленного идентификатора. Ошибки такого рода будут у вас чаще всего – это результат описки в имени переменной, компонента, свойства, метода, функции.
Если в приложении несколько ошибок, то соответственно будет и несколько сообщений о них. Перейдя в окно сообщений и сделав двойной щелчок на каком-то из сообщений вы увидите, что в окне Редактора Кода выделится строка, соответствующая этому сообщению.
Поскольку рассмотренная выше ошибка неисправима, то в данном примере вы видите внизу последнее сообщение:
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
([Неисправимая ошибка] проект Project1.dpr, строка 5: Невозможно откомпилировать используемый модуль Unit1.pas)
Таким образом, в данном случае выполняемый модуль не сформирован и приложение не выполняется.
Если вы исправите в ошибочном операторе переменную В на А, то получите новое сообщение об ошибке:
[Error] Unit1.pas(35): Incompatible types: 'String' and 'Double'
([Ошибка] модуль Unit1.pas, строка 35: Несовместимые типы ‘String’ и ‘Double’)
Действительно, нельзя присвоить переменной типа string – надписи Caption значение переменной А, объявленной как double. Подобные ошибки использования несовместимых типов тоже очень распространены и вы, вероятно, не раз невольно будете их делать.
Правильный оператор в нашем примере должен иметь вид:
Label1.Caption:='A= '+FloatToStr(A);
Исправив этот оператор, не нажимайте пока клавишу F9, поскольку приложение запустится на выполнение и вы не увидите еще сообщений, которые появятся. Нажмите лучше Ctrl+F9 -- компиляцию без выполнения. На этот раз сообщения о неисправимой ошибке не будет и выполняемый модуль создастся. Но появится замечание:
[Hint] Unit1.pas(31): Variable 'j' is declared but never used in 'TForm1.Button1Click'
([Замечание] модуль Unit1.pas, строка 31: переменная ‘j’ объявлена, но нигде в ‘Unit1’ не используется)
Действительно, мы объявили переменную j, но не использовали ее. Если эта переменная -- заготовка для каких-то будущих процедур, то это замечание можно проигнорировать. Но если переменная j действительно не нужна, то ее объявление лучше удалить из текста, так как под эту переменную тратится, конечно, небольшой, но совершенно бессмысленный объем памяти.
С этим замечанием мы разобрались. Но у нас появилось еще одно более серьезное предупреждение:
[Warning] Unit1.pas(35): Variable 'A' might not have been initialized
([Предупреждение] модуль Unit1.pas, строка 35: Переменная ‘А’ может оказаться не инициализированной)
Действительно, мы ввели локальную переменную А и нигде не задали ее начальное значение. С точки зрения компилятора это не ошибка, а замечание. Но для программы это действительно ошибка, так как, строго говоря, неизвестно, чему будет равно значение этой переменной при входе в процедуру. Если мы хотим, например, чтобы при каждом выполнении процедуры значение А равнялось 1, мы должны добавить перед циклом оператор:
А:=1;
Если же мы хотим, чтобы в переменной А накапливался результат при каждом щелчке на кнопке, мы должны убрать ее объявление из процедуры и ввести ее объявление как типизированной константы после объявления раздела implementation предложением:
{$J+}
Const A:double=1;
Здесь, {$J+} – директива компилятора, которая позволяет изменять значения именованных констант.
Этот пример показывает, что не надо пренебрегать замечаниями компилятора. Всегда лучше перед запуском на выполнение сначала просто откомпилировать проект, тщательно проанализировать каждое замечание и только исправив все, что требует исправления, выполнять приложение. Это сэкономит вам время, которое в противном случае вы потратите на поиск причин, по которым ваша программа работает неправильно.
Пусть в нашем примере мы хотим накапливать результат в переменной А. Тогда после всех исправлений ваш код может иметь вид:
Дата добавления: 2015-11-13; просмотров: 81 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Компиляция без последующего выполнения. | | | Ошибка выполнения. |