Массив
Delphi: сообщения компилятора.
Часть 1 (expexted, ambiguous, assign, required)
Типов сообщения компилятора очень много, более двух сотен. В
данной статье я расскажу о наиболее часто встречающихся. И так, начнем:
<Что-то1>
expected but <Что-то2> found.
Обычно это синтаксическая ошибка. Например, пропущена
скоба: отрытых скобок больше, чем закрытых. В этом случае при компиляции
программы компьютер сообщит: "')' expected but ';' found":
Другой часто встречающийся случай
"'END' expected but ',' found". Это сообщение может быть выдано
в случае, если в качестве разделителя целой и дробной части вместо точки указали
запятую:
<Имя> is not a
type identifier.
Данное <Имя> не является именем типа. Такая ошибка выходит
в случае, если вы пытаетесь объявить тип переменной, а в качестве имени типа
используете имя, которое уже было использовано для чего то другого. Например,
таким именем уже объявлена переменная:
‘;’ not allowed before 'Else'. Перед командой else
нельзя ставить точку с запятой. Тут комментарии излишни.
Abstract method must be virtual or dynamic.
Абстрактный метод должен быть виртуальный или динамический.
Давайте разберемся, почему он не может быть обычным. Предположим, мы пишем
компьютерную игру. У нас есть некий класс TUnit, который
предназначен для отрисовки "человечка". У него есть методы draw
и undraw, которые соответственно рисуют и убирают с
экрана игровой объект. Допустим, у нас есть метод Go,
который сначала вызывает метод Undraw, изменяет его
координаты и запускает метод draw. Мы решили создать
другой класс, например, TAdvancedUnut, который будет
выглядеть немножко по другому, и нам потребуется переписать у него метод
draw. Метод Go при этом не меняется.
Угадайте, с трех раз, как будет работать метод go, если
мы его оставим как есть?
Правильно, если мы объявим метод
draw виртуальным, то
метод go вызовет правильный метод draw,
а если нет, то старый, тот, что реализован у TUnit.
Теперь перейдем к абстрактным методам. Представьте себе,
что TUnit - это не полноценный класс, а только заготовка.
Мы знаем, что у всех его предков (или почти у всех), метод go
будет одинаковым, а draw - разным.
В этом случае мы
можем у
tUnit
объявить
абстрактный метод
draw. Понятно, что если мы не объявим его виртуальным или
динамическим, то у всех потомков данного класса будет вызывается несуществующий
код метода draw.
Ambiguous overloaded call to <Имя блока>.
Компилятор не может однозначно выбрать перегружаемый блок. Измените параметр.
Такое сообщение об ошибках возникает, когда вы пытаетесь
перезагрузить процедуру или функцию с таким набором параметров, когда невозможно
сделать однозначный выбор. Например,
вот так:
procedure proba(a:integer;
b:integer=0); overload;
procedure proba(a:integer; b:boolean=false); overload; |
Если
вы попытаетесь использовать в дальнейшем процедуру
proba с
одним параметром, то будет выдано это сообщение:
Действительно, откуда компьютер знает, что пользователь имел в виду, когда в
конструкции
опустил параметр по умлчанию6 то ли это b:integer=0,
то ли b:boolean=false.
Array type required.
Ошибка возникает в случаях, когда в индексе элемента массива указано больше
уровней, чем предусмотрено описанием, и если массив не описан. Например, после
объявления двумерного массива х или простой переменной х ошибочно записывают
элемент х[2,1,1] (в нем показано три измерения).
Assignment to FOR-loop variable <Имя>.
Присваивание значения параметру FOR-цикла в теле цикла. Например, вследствие
описки дважды используется имя i в кратном цикле:
For i:= 1 to n do
For i:= 1 to m do ... |
Break or Continue outside of loop.
Break или Continue — не в цикле. Тут тоже комментарии излишни -
эти операторы не имеют смысла вне цикла.
Cannot initialize local variables.
Локальные переменные запрещено инициализировать (задавать им значения при
описании).
Вот так
не правильно:
Надо сделать вот так:
Cannot assign to/read a read-only/write-only property.
Присвоение значения свойству read/only и чтение свойства write/only запрещены.
Вот пример конструкции с такой ошибкой:
Constant
expression expected.
В этом месте должна стоять константа или константное выражение, например
константа выбора в структуре Case.
Вот пример данной ошибки:
А вот так правильно:
Constant expression violates subrange bounds.
Выход значения константы из диапазона. Контроль не полон. Например,
компилятор проупстит присваивание x:=4000000000,
где х имеет тип integer, но значение х будет искажено.
Constant or type identifier expected.
Требуется имя типа или тип-диапазон.
Вот пример
такой ошибки:
В
Delphi тип text не применяется, правильно
сделать так:
procedure
TForm1.FormCreate(Sender: TObject);
var MyVar:TextFile;
begin
end; |
Could not
compile used unit <Имя>.
Компиляция
присоединенного модуля <Имя> невозможна. В секции uses
вы указали файл, который система не может скомпилировать.
Причины могу быть самые разные, например, в этом модуле имеются какие либо
другие ошибки:
Data type too
large. Тип
определяет структуру размером более 2 Гбайт; это слишком много.
Такой большой файл может даже в память ОЗУ не поместиться, елси ее менее 2 Гб,
что еще пока бывает. Тут, думаю, комментарии излишний.
Declaration expected
but <Что-то> found.
Пропущено описание или оператор. Вот пример данной ошибки (ее
причина лишнее слово "end" в конструкции "case"):
Продолжение следует.
Скриншоты, приведенные в данной
статье , являются цитатами и иллюстрациями
программного продукта "Turbo Delphi",
авторское право на который принадлежит "Borland
Software Corporation.
|