.
Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)
Автор megabax   
29.06.2010 г.
Массив

 Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)

Типов сообщения компилятора очень много, более двух сотен. В данной статье я расскажу о наиболее часто встречающихся. И так, начнем:

<Что-то1> expected but <Что-то2> found.  Обычно это синтаксическая ошибка. Например, пропущена скоба: отрытых скобок больше, чем закрытых. В этом случае при компиляции программы компьютер сообщит: "')' expected but ';' found":

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)

Другой часто встречающийся случай "'END' expected but ',' found". Это сообщение может быть выдано в случае, если в качестве разделителя целой и дробной части вместо точки указали запятую:

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)

 

<Имя> is not a type identifier. Данное <Имя> не является именем типа. Такая ошибка выходит в случае, если вы пытаетесь объявить тип переменной, а в качестве имени типа используете имя, которое уже было использовано для чего то другого. Например, таким именем уже объявлена переменная:

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)

‘;’ 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 с одним параметром, то будет выдано это сообщение:

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)


Действительно, откуда компьютер знает, что пользователь имел в виду, когда в конструкции

proba(1)

опустил параметр по умлчанию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. Локальные переменные запрещено инициализировать (задавать им значения при описании).

Вот так не правильно:

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)


Надо сделать вот так:


Cannot assign to/read a read-only/write-only property. Присвоение значения свойству read/only и чтение свойства write/only запрещены. Вот пример конструкции с такой ошибкой:

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)


Constant expression expected. В этом месте должна стоять константа или константное выражение, например константа выбора в структуре Case.

Вот пример данной ошибки:
 

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)

А вот так правильно:

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)

Constant expression violates subrange bounds. Выход значения константы из диапазона. Контроль не полон. Например, компилятор проупстит присваивание x:=4000000000, где х имеет тип integer, но значение х будет искажено.
 

Constant or type identifier expected. Требуется имя типа или тип-диапазон.

Вот пример такой ошибки:

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)

В Delphi тип text не применяется, правильно сделать так:

procedure TForm1.FormCreate(Sender: TObject);
var MyVar:TextFile;
begin

end;

Could not compile used unit <Имя>. Компиляция присоединенного модуля <Имя> невозможна. В секции uses вы указали файл, который система не может скомпилировать. Причины могу быть самые разные, например, в этом модуле имеются какие либо другие ошибки:

Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)


Data type too large. Тип определяет структуру размером более 2 Гбайт; это слишком много. Такой большой файл может даже в память ОЗУ не поместиться, елси ее менее 2 Гб, что еще пока бывает.  Тут, думаю, комментарии излишний.

Declaration expected but <Что-то> found. Пропущено описание или оператор. Вот пример данной ошибки (ее причина лишнее слово "end" в конструкции "case"):


Delphi: сообщения компилятора. Часть 1 (expexted, ambiguous, assign, required)


Продолжение следует.

 

 


Скриншоты, приведенные в данной статье , являются цитатами и иллюстрациями   программного продукта "Turbo Delphi", авторское право на который принадлежит "Borland Software Corporation.


 

Последнее обновление ( 06.02.2013 г. )