.
Delphi: сообщения компилятора. Часть 2 (differs, default, parameter, declarations)
Автор megabax   
10.01.2011 г.
Массив

 Delphi: сообщения компилятора. Часть 2 (differs, default, parameter, declarations)

Продолжу публикацию о сообщениях компилятора. 

Declaration of <Имя> differs from previous declarations... Данный заголовок блока не соответствует упреждающему объявлению блока. Такая ошибка может возникнуть например в том случае, если вы создали класс, объявили у него виртуальный метод, а в следующем классе переопределяете этот метод но с другим набором параметров:

 Delphi: сообщения компилятора. Часть 2 (differs, default, parameter, declarations)

Выйдет такая ошибка так же в том случае, если вы метод объявили с одним набором параметров, а реализуете его с другим набором:

 Delphi: сообщения компилятора. Часть 2 (differs, default, parameter, declarations)

Default parameter <Имя> must be by-value or constant. Необязательный параметр (со значением по умолчанию) не должен вызываться по ссылке. Тоесть, если вы у какой то функции объявляете необязательный параметр, например, вот так:

procedure Proba(a:string='defalut');

то потом вы можете написать вот так:

procedure TfrmErrorTest.btnStartClick(Sender: TObject);

begin

   Proba();

   Proba('ddd');

end;

Но если вы попробуете написать что то вроде:   

procedure Proba(var a:string='defalut');

то у вас будет выдано вышеназванное сообщение об ошибке. Почему так? Дело в том, что когда вы пишите что то вроде того:

procedure Proba1(var a:string);

begin

   a:='My value';

end;

то вы потом можете написать вот так:

procedure TfrmErrorTest.btnStartClick(Sender: TObject);

var s:string;

begin

   Proba1(s);

   messageDlg(s,mtInformation,[mbOk],0);

end;

Таким образом, процедура у вас изменит содержимое переменной. Естественно, в этом случае вызов процедуры без параметров просто не имеет смысла, поэтому параметр с директивой default не может быть объявлен как var. 

File type not allowed here. В этом месте или в этой роли файловую переменную нельзя использовать. Например, она не может быть формальным параметром-значением. В частности, вот такой код скомпилирован не будет:

  procedure Proba(a:TextFile);

Правильно вот так:

  procedure Proba(var a:TextFile);

 For loop control variable must have ordinal type. Параметр цикла должен иметь порядковый тип. Вещественный тип запрещен. Вот пример кода, содержащего такую ошибку:

procedure Proba1(var a:string);

var i:double;

begin

   a:='My value';

   for I := 0 to 10 do

end;

Function needs result type. В заголовке функции надо указывать тип ее результата. Если встречается такая ошибка, значит, вы не указали тип возвращенного функцией значения. вот так неправильно:

function Proba(var a:TextFile);

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

function Proba(var a:TextFile):string;

Identifier expected but <Что-то> found. В этом месте должно стоять имя. Например, пропущено имя функции после Function. Вот пример кода с такой ошибкой6

function (var a:TextFile):string;

 

Identifier redeclared <Имя>.<Имя> описано повторно, но в пределах блока имя можно описать лишь раз. Проверьте, не обозначена ли локальная переменная тем же именем, что и формальный параметр блока. 

 

Illegal character in input file <знак>. Запретный знак, например "русская" буква, либо вы оставили скобку }, убрав открывающую скобку {. 

 

Incompatible types <указание типов>. Несоответствие типов по присваиванию или типов операндов одной операции. Сообщение выдается и при неверном использовании структур. Например, z - запись, ошибочно записано присваивание z:= 0 (работать надо с полями записи).

Label already defined: <Метка>. <Метка> уже помечает другой оператор. 

Left side cannot be assigned to. He может быть такой левой части в присваивании. Примеры: попытка присвоить значение файловой переменной, присвоение значения формальному параметру-константе. 

Line too long. В строке программного текста больше 255 знаков. Например, такая ошибка возникает при "кривом" объявлении массива, например, вот так:

ar:array[3..2] of integer;

правильно будет вот так

ar:array[2..3] of integer

 Missing operator or semicolon. Пропуск операции (например перед скобкой) или пропуск точки с запятой. При пропуске ';' маркер ошибки стоит на очередном предложении (объявлении или операторе). Вот пример кода с данной ошибкой:

 Delphi: сообщения компилятора. Часть 2 (differs, default, parameter, declarations)

Not enough actual parameters. He хватает фактических параметров. Такое сообщение "выскочит" если вы объявили процедуру или функцию с параметрами (обязательными), а когда используете ее, то параметры указать забыли.

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

 


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


 

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