Error constant expression expected

Типов сообщений компилятора — более двухсот. Рассмотрим перечень наиболее встречающихся сообщений класса Error

Типов сообщений компилятора — более двухсот. Рассмотрим перечень наиболее встречающихся сообщений класса Error

  • 0. <Что-то1> expected but <Что-то2> found. Обычно это сообщение возникает при синтаксической ошибке.Например,в случае небаланса скобок,компилятор сообщит: ‘)’ expected but ‘;’ found (вместо ожидавшейся скобки найдена запятая).

    Компилятор часто сообщает, что ‘end’ ожидается,например:x:= 5,7; здесь неуместен разделитель-запятая, а сообщается про end. (‘END’ expected but ‘,’ found)

  • 1. <Имя> is not a type identifier. Данное <Имя> не является именем типа.
  • 2. ‘;’ not allowed before ‘Else’. Перед else нельзя ставить точку с запятой
  • 3. Abstract method must be virtual or dynamic. Абстрактный метод должен быть виртуальным или динамическим.
  • 4. Ambiguous overloaded call to <Имя блока>. Компилятор не может однозначно выбрать перегружаемый блок. Измените параметр.
  • 5. Array type required. Ошибка возникает в случаях, когда в индексе элемента массива указано больше уровней, чем предусмотрено описанием, и если массив не описан. Например, после объявления двумерного массива х или простой переменной х ошибочно записывают элемент х[2,1,1] (в нем показано три измерения).
  • 6. Assignment to FOR-loop variable <Имя>. Присваивание значения параметру FOR-цикла в теле цикла.

    Например, вследствие описки дважды используется имя i в кратном цикле:

    For i:= 1 to n do For i:= 1 to m do ...
    
  • 7. Break or Continue outside of loop. Break или Continue — не в цикле.
  • 8. Cannot initialize local variables. Локальные переменные запрещено инициализировать (задавать им значения при описании).
  • 9. Cannot assign to/read a read-only/write-only property. Присвоение значения свойству read/only и чтение свойства write/only запрещены.
  • 10. Constant expression expected.В этом месте должна стоять константа или константное выражение, например константа выбора в структуре Case.
  • 11. Constant expression violates subrange bounds. Выход значения константы из диапазона. Контроль не полон. Например, «сойдет с рук» присваивание x:=3000000000, где х имеет тип integer, но начение х будет искажено.
  • 12. Constant or type identifier expected. Требуется имя типа или тип-диапазон.
  • 13. Could not compile used unit <Имя>. Компиляция присоединенного модуля <Имя> невозможна.
  • 14. Data type too large. Тип определяет структуру размером более 2 Гбайт; это слишком много.
  • 15. Declaration expected but <Что-то> found. Пропущено описание или оператор.
  • 16. Declaration of <Имя> differs from previous declarations… Данный заголовок блока не соответствует упреждающему объявлению блока.
  • 17. Default parameter <Имя> must be by-value or constant. Необязательный параметр (со значением по умолчанию) не должен вызываться по ссылке.
  • 18. Expression expected. В этом месте программы должно стоять выражение.
  • 19. Expression too complicated. Выражение излишне сложно для компиляции.
  • 20. File type not allowed here. В этом месте или в этой роли файловую переменную нельзя использовать. Например, она не может быть формальным параметром-значением.
  • 21. For loop control variable must be simple local variable. Параметр цикла должен быть простой локальной (описанной в этом же блоке) переменной.
  • 22. For loop control variable must have ordinal type. Параметр цикла должен иметь порядковый тип.Вещественный тип запрещен.
  • 23. Function needs result type. В заголовке функции надо указывать тип ее результата.
  • 24. Identifier expected but <Что-то> found. В этом месте должно стоять имя. Например, пропущено имя функции после Function.
  • 25. Identifier redeclared <Имя>.<Имя> описано повторно, но в пределах блока имя можно описать лишь раз. Проверьте, не обозначена ли локальная переменная тем же именем, что и формальный параметр блока.
  • 26. Illegal character in input file <знак>. Запретный знак, например «русская» буква, либо вы оставили скобку }, убрав открывающую скобку {.
  • 27. Illegal type in Read/Readln (Write/Writeln) statement. Элемент запрещенного типа в списке ввода/вывода.
  • 28. Incompatible types <указание типов>. Несоответствие типов по присваиванию или типов операндов одной операции. Сообщение выдается и при неверном использовании структур. Например, z — запись, ошибочно записано присваивание z:= 0 (работать надо с полями записи).
  • 29. Invalid function result type. Недопустимый тип результата функции.
  • 30. Label already defined: <Метка>. <Метка> уже помечает другой оператор.
  • 31. Left side cannot be assigned to. He может быть такой левой части в присваивании. Примеры: попытка присвоить значение файловой переменной, присвоение значения формальному параметру-константе.
  • 32. Line too long. В строке программного текста больше 255 знаков.
  • 33. Low bound exceeds high bound. Нижняя граница превышает верхнюю.
  • 34. Missing operator or semicolon.Пропуск операции (например перед скобкой) или пропуск точки с запятой. При пропуске ‘;’ маркер ошибки стоит на очередном предложении (объявлении или операторе).
  • 35. Missing parameter type. He указан тип формального параметра-значения или параметра процедурного типа.
  • 36. Not enough actual parameters. He хватает фактических параметров.
  • 37. Need to specify at least one dimension … Нужно задавать в операторе SetLength хотя бы один размер динамического массива.
  • 38. Number of elements differs from declaration. Число элементов в структурной константе не соответствует ее описанию.
  • 39. Operator not applicable to this operand type. Операция не применима к операндам данного типа. Например: ‘А’ or ‘В’; ‘Text1’* ‘Text2’.
  • 40. Order of fields in record constant differs from declaration. Порядок полей в записи-константе не соответствует описанию записи.
  • 41. Ordinal type required. Требуется порядковый тип (например, в индексе).
  • 42. Out of memory. Компилятору не хватает памяти.
  • 43. Statement expected but <Что-то> found. В этом месте должен стоять оператор. Сообщение выдается во всех случаях, когда в тело блока или секцию инициализации ошибочно помещают описание (<Что-то>). Ошибочная форма обращения к процедуре Procedure <Имя> или к функции Function <Имя> также вызывает сообщение.
  • 44. Sets may have at most 256 elements. Множество (тип Set) не может содержать более 256 элементов.
  • 45. Slice standard function only allowed as open array argument. Функцию Slice можно использовать лишь как фактический параметр
  • 46. Statement not allowed in interface part. Предложения в секции интерфейса программного модуля недопустимы.
  • 47. Syntax error in real number. Синтаксическая ошибка в записи числа вещственного типа.
  • 48. There is no overload version of <Имя> that can be called with these arguments.Не предусмотрен перегружаемый блок <Имя>, который мог бы вызываться с таким аргументом. Пример: IntToStr(x), где х – выражение вещественного типа.
  • 49. Too many actual parameters. Фактических параметров больше, чем формальных.
  • 50. Type actual and formal var parameters must be identical. Тип фактического параметра должен быть идентичен типу формального параметра-переменной.
  • 51. Type of expression must be <Тип>. Выражение должно быть указанного типа. Например,после While и Until должно стоять логическое выражение.
  • 52. Undeclared identifier: <Имя>.Не описано <Имя>. Проверьте есть ли описание в нужном месте,нет ли описок в имени. Если указано имя компонента формы, проверьте,поместили ли компонент на данную форму.
  • 53. Unexpected end of file in comment started on line <N>. Неожиданный конец файла при незавершенном комментарии, начало комментария — в строке N.
  • 54. Unit name mismatch: <Имя>. Имя модуля ошибочно.
  • 55. Unsatisfied forward or external declaration <Имя>. Отсутствует описание блока, объявление которого было дано (заголовок в интерфейсе или в описании объектного типа, либо упреждающее описание).
  • 56. Unterminate string. He закрыта апострофом строка-константа типа string.

Рассмотрим также некоторые сообщения классов warning и hint.

  • Return value of function <Имя> might be undefined. В теле функции нет присваивания ее результата.
  • Variable <Имя> might not have been initialized. Указывает имя переменой, которой не задали значения.
  • For-Loop variable <Имя> may be undefined after loop. Попытка использования значения параметра For-цикла после завершения этого цикла.
  • Text after final ‘END.’ ignored by compiler. Текст, идущий за конечной строкой модуля, игнорируется компилятором.
  • Variable <Имя> is declared but never used in <Имя блока>. Обращает внимание на переменную <Имя>, описанную,но не нашедшую применения.
  • Value assigned to <Имя> never used. Хотя бы одно значение переменной <Имя> никак не использовано.

Несколько рекомендаций

Сосредотачивайтесь на первом сообщении компилятора. Исправление хотя бы одной ошибки и повторная компиляция может значительно уменьшить число сообщений об ошибках,поэтому не упорствуйте, стремясь понять сразу причину каждого сообщения.

Не удаляйте прежний вариант кода,пока не убедитесь,что ошибка устранена. Лучше на время закомментировать код,заключив его в скобки: { код }

Компилятор не анализирует, как будет выполняться программа, поэтому выход значения индекса из диапазона выявляет только если индекс задан константным выражением. Деление на ноль вообще пропускается, кроме оператора div, в случае если делитель — константное выражение.

В этом разделе описаны все ошибки, которые могут случиться при проверке типов.

Сообщение

Описание

Error: Type mismatch

Это может произойти во многих случаях:

Назначенная вами переменная отличается от типа, который используется в выражении

Вы вызываете функцию или процедуру с параметрами, которые несовместимы с параметрами в объявлении функции или процедуры

Error: Incompatible types: got «Сообщ1» expected «Сообщ2»

Невозможно преобразование между двумя типами. Ещё одна причина – типы объявлены в разных объявлениях:

Var A1 : Array[1..10] Of Integer;
  A2 : Array[1..10] Of Integer;
Begin
A1:=A2; {Этот оператор также даёт такую ошибку, потому
          что выполняется строгая проверка типов Pascal}
End.

Error: Type mismatch between «Сообщ1» and «Сообщ2»

Типы не являются эквивалентными.

Error: Type identifier expected

Идентификатор не является типом, или вы забыли указать идентификатор type.

Error: Variable identifier expected

Это случается, если вы помещаете константу в процедуру (такую как Inc или Dec), в то время как процедура требует переменной. Для таких процедур в качестве параметров можно помещать только переменные.

Error: Integer expression expected, but got «Сообщение»

Компилятор ожидает выражения типа integer, но получает другой тип.

Error: Boolean expression expected, but got «Сообщение»

Выражение должно быть типа boolean. Оно должно возвращать True или False.

Error: Ordinal expression expected

Выражение должно быть порядкового типа, то есть максимум типа Longint. Эта ошибка случается, например, если вы указали второй параметр процедуры Inc или Dec, который не соответствует порядковому типу.

Error: pointer type expected, but got «Сообщение»

Переменная или выражения не являются указателем. Это случается, если вы помещаете переменную, которая не является указателем, в New или Dispose.

Error: class type expected, but got «Сообщение»

Переменная или выражение не являются типом class. Это обычно случается, если

1.Родительский класс в объявлении класса не является классом

2.Обработчик исключения (On) cсодержит идентификатор типа, который не является классом.

Error: Can’t evaluate constant expression

Эта ошибка может случиться, если границы объявленного вами массива не обозначены порядковыми константами.

Error: Set elements are not compatible

Вы пытаетесь выполнить операцию с двумя множествами, в то время как типы элементов этих множеств не являются одинаковыми. Базовые типы множеств должны быть одинаковыми при объединении.

Error: Operation not implemented for sets

Некоторые бинарные операторы не определены для множеств. Это операторы: div, mod, **, >= и <=. Последние два могут быть определены для множеств в будущих версиях.

Warning: Automatic type conversion from floating type to COMP which is an integer type

Обнаружено явное преобразование типов из real в comp. s encountered. Поскольку comp – это 64-битное целое число, то это может вызвать ошибку.

Hint: use DIV instead to get an integer result

Если подсказки включены, то целочисленное деление с оператором ‘/‘ приведёт к этому сообщению, потому что результатом будет вещественный тип.

Error: string types doesn’t match, because of $V+ mode

Если выполняется компиляция в режиме {$V+}, то строка, передаваемая вами в качестве параметра, должна быть точно такого же типа, как параметр процедуры.

Error: succ or pred on enums with assignments not possible

Если вы объявили перечисляемый тип в стиле С, например, так:

Tenum = (a,b,e:=5);

То вы не сможете использовать функции Succ или Pred с этим перечислением.

Error: Can’t read or write variables of this type

Вы пытаетесь прочитать или записать переменную из файла или в файл текстового типа, который не поддерживает тип переменной. Только целочисленные типы, вещественные, pchars и strings можно читать из файла или записывать в текстовый файл. Логические переменные можно только записывать в текстовый файл.

Error: Can’t use readln or writeln on typed file

readln и writeln можно использовать только с текстовыми файлами.

Error: Can’t use read or write on untyped file.

read и write допускаются только для текстовых или типизированных файлов.

Error: Type conflict between set elements

Это означает, что не менее одного элемента множества имеют неправильный тип.

Warning: lo/hi(dword/qword) returns the upper/lower word/dword

Free Pascal поддерживает перегруженную версию lo/hi для longint/dword/int64/qword, которые возвращают наименьшее/наибольшее (результат типа слово/двойное слово) значение аргумента. Turbo Pascal позволяет использовать 16-битные lo/hi, которые возвращают биты 0..7 для lo и биты 8..15 для hi. Если вы хотите получить поведение, аналогичное Turbo Pascal, вы должны использовать приведение типов к word или integer.

Error: Integer or real expression expected

Первый аргумент для str должен быть типа real или integer.

Error: Wrong type «Сообщение» in array constructor

Вы пытаетесь использовать тип в конструкторе массива, который недопустим.

Error: Incompatible type for arg no. Сообщ1: Got «Сообщ2», expected «Сообщ3»

Вы пытаетесь передать неправильный тип в указанный параметр.

Error: Method (variable) and Procedure (variable) are not compatible

Вы не можете связать метод с процедурной переменной или процедуру с указателем на метод.

Error: Illegal constant passed to internal math function

Аргумент-константа, переданный в функцию ln или sqrt выходит за пределы диапазона для этой функции.

Error: Can’t take the address of constant expressions

Невозможно получить адрес выражения-константы, потому что оно не записывается в память. Вы можете попробовать сделать типизированную константу. Эта ошибка может также появиться, если вы пытаетесь поместить свойство в параметр var.

Error: Argument can’t be assigned to

Только выражение, которое может быть в левой части присваивания, может быть передано как вызов по ссылке аргумента. Примечание: Свойства могут использоваться в левой части присваивания, тем не менее, они не могут использоваться как аргументы.

Error: Can’t assign local procedure/function to procedure variable

Не допускается присваивать локальные процедуры/функции процедурным переменным, потому что соглашение о вызовах локальных процедур/функций отличаются. Вы можете только присвоить локальную процедуру/функцию пустому указателю.

Error: Can’t assign values to an address

Не допускается присваивать значение адресу переменной, константы, процедуры или функции. Вы можете попытаться выполнить компиляцию с опцией -So, если идентификатор является процедурной переменной.

Error: Can’t assign values to const variable

Не допускается присваивать значение переменной, которая объявлена как константа. Обычно параметр объявляется как константа. Чтобы иметь возможность изменять значение, передавайте параметр по значению или параметр по ссылке (используя var).

Error: Array type required

Если вы хотите получить доступ к переменной, используя индекс ‘[<x>]‘, то тип должен быть массивом. В режиме FPC указатель также допускается.

Error: interface type expected, but got  «»Сообщение»

Компилятор ожидал для нумератора имя типа интерфейса, но получил нечто другое. Следующий код приведёт к этой ошибке:

Type
TMyStream = Class(TStream,Integer)

Hint: Mixing signed expressions and longwords gives a 64bit result

Если вы делите (или вычисляете модуль) выражения со знаком с типом longword (или наоборот), или если вы имеете переполнение и/или включена проверка диапазона и используется арифметическое выражение (+, -, *, div, mod), в котором оба числа со знаком и появляется longwords, то всё это вычисляется как 64-битная арифметическая операция, которая медленнее, чем обычная 32-битная. Вы можете избежать этого при помощи преобразования типа одного из операндов в подходящий для результата и другого операнда.

Warning: Mixing signed expressions and cardinals here may cause a range check error

Если вы используете бинарный оператор (and, or, xor) и один из операндов — это longword, в то время как другой – это выражение со знаком, то, если проверка диапазона включена, вы можете получить ошибку проверки диапазона, потому что в этом случае оба операнда преобразуются в longword перед выполнением операции. Вы можете избежать этого при помощи преобразования типа одного из операндов в подходящий для результата и другого операнда.

Error: Typecast has different size (Сообщ1 -> Сообщ2) in assignment

Преобразование типа при отличающихся размерах не допускается, когда переменная используется в присваивании.

Error: enums with assignments can’t be used as array index

Если вы объявили перечисляемый тип, который имеет С-подобные присваивания, как показано ниже:

Tenum = (a,b,e:=5);

Вы не можете использовать его как индекс массива.

Error: Class or Object types «Сообщ1» and «Сообщ2» are not related

Выборка из одного класса в другой, в то время как класс/объект не являются связанными. Вероятно, это ошибка ввода.

Warning: Class types «arg1» and «arg2» are not related

Выборка из одного класса в другой, в то время как класс/объект не являются связанными. Вероятно, это ошибка ввода.

Error: Class or interface type expected, but got «arg1»

Компилятор ожидал имя класса или интерфейса, но получил другой тип или идентификатор.

Error: Type «Сообщение» is not completely defined

Эта ошибка случается, если тип не завершён, например, тип pointer, который указывает на неопределённый тип.

Warning: String literal has more characters than short string length

Размер строки-константы, которая связана с shortstring, больше максимального размера для shortstring (255 символов).

Warning: Comparison is always false due to range of values

Это сравнение беззнакового значения и константы со знаком, которая меньше нуля. По причине преобразования оператор всегда будет возвращать FALSE. Выполните явное преобразование константы в правильный диапазон, чтобы избежать этой проблемы.

Warning: Comparison is always true due to range of values

Это сравнение беззнакового значения и константы со знаком, которая меньше нуля. По причине преобразования оператор всегда будет возвращать TRUE. Выполните явное преобразование константы в правильный диапазон, чтобы избежать этой проблемы.

Warning: Constructing a class «Сообщ1» with abstract method «Сообщ2»

Например, создаваемый класс содержит неисполняемые абстрактные методы. Имеется вероятность, что случится ошибка времени исполнения 211 в коде, если эта процедура будет когда-либо вызвана. Все абстрактные методы должны быть перегружаемыми.

Hint: The left operand of the IN operator should be byte sized

Левый операнд в операторе IN не является порядковым или перечислением, который помещается в 8 бит. Это может привести к ошибке проверки диапазона. На текущий момент оператор in поддерживает левый оператор только в пределах байта. В случае с перечислениями, размер элемента перечисления может изменяться опциями {$PACKENUM} или {$Zn}.

Warning: Type size mismatch, possible loss of data / range check error

Это случается, когда меньшему типу присваивается значение, большее, чем исходный тип. Это означает, что может произойти ошибка проверки диапазона или уменьшение значения.

Hint: Type size mismatch, possible loss of data / range check error

Это случается, когда меньшему типу присваивается значение, большее, чем исходный тип. Это означает, что может произойти ошибка проверки диапазона или уменьшение значения.

Error: The address of an abstract method can’t be taken

Не найдено тело абстрактного метода, поэтому адрес абстрактного метода не может быть назначен.

Error: Assignments to formal parameters and open arrays are not possible

Вы пытаетесь присвоить значение формальному параметру (нетипизированный var, const или out), или открытому массиву.

Error: Constant Expression expected

Компилятор ожидал выражение-константу, но получил выражение- переменную.

Error: Operation «Сообщ1» not supported for types «Сообщ2» and «Сообщ3»

Операция не допускается для указанных типов.

Error: Illegal type conversion: «Сообщ1» to «Сообщ2»

Когда выполняете преобразование типов, вы должны понимать, что размеры переменной и типа назначения одинаковы.

Hint: Conversion between ordinals and pointers is not portable

Если вы преобразуете тип pointer в longint (или наоборот), то код не будет компилироваться на машинах, использующих 64-разрядную адресацию.

Warning: Conversion between ordinals and pointers is not portable

Если вы преобразуете тип pointer в порядковый тип с другим размером (или наоборот), то могут возникнуть проблемы. Это предупреждение помогает в поиске 32-битного специального кода, где cardinal/longint используются для преобразования указателей в порядковые типы. Решением проблемы является использование вместо этого типов ptrint/ptruint.

Error: Can’t determine which overloaded function to call

Вы вызываете перегруженную функцию с параметром, который не связан с каким-либо объявленным списком параметров, например, когда вы имеете объявленную функцию с параметрами word и longint, а затем вызываете её с параметром типа integer.

Error: Illegal counter variable

Переменная для цикла for должна быть порядкового типа. Переменные циклов не могут быть вещественными числами или строками.

Warning: Converting constant real value to double for C variable argument, add explicit typecast to prevent this.

В C значения вещественных констант по умолчанию имеют тип double. Из этих соображений, когда вы передаёте вещественную константу в функцию С в качестве параметра, компилятор FPC по умолчанию преобразует её в тип double. Если вы хотите контролировать этот процесс, добавьте для константы явное преобразование в нужный тип.

Error: Class or COM interface type expected, but got «Сообщение»

Некоторые операторы, такие как AS, применяются только для классов или COM-интерфейсов.

Error: Constant packed arrays are not yet supported

Вы не можете объявить битовый (упакованный) массив как типизированную константу.

Error: Incompatible type for arg no. Сообщ1: Got «Сообщ2» expected «(Bit)Packed Array»

Компилятор ожидает битовый (упакованный) массив как указанный параметр.

Error: Incompatible type for Сообщение no. Сообщ1: Got «Сообщ2» expected «»(not packed) Array»

Компилятор ожидает регулярный (то есть НЕ упакованный) массив как указанный параметр.

Error: Elements of packed arrays cannot be of a type which need to be initialised

Поддержка упакованных массивов, которым необходима инициализация (таких как ansistrings, или записей, содержащих ansistrings), пока не реализована.

Error: Constant packed records and objects are not yet supported

Вы не можете объявить битовый (упакованный) массив как типизированную константу в данное время.

Warning: Arithmetic «Сообщение» on untyped pointer is unportable to {$T+}, suggest typecast

Сложение/вычитание из нетипизированных указателей может работать по разному в {$T+}. Используёте преобразование типов для типизированных указателей.

Error: Can’t take address of a subroutine marked as local

Нельзя получить адрес подпрограммы, помеченной как локальная.

Error: Can’t export subroutine marked as local from a unit

Подпрограмма, помеченная как локальная, не может быть экспортирована из модуля.

Error: Type is not automatable: «Сообщение»

Только byte, integer, longint, smallint, currency, single, double, ansistring, widestring, tdatetime, variant, olevariant, wordbool и все интерфейсы являются automatable.

Hint: Converting the operands to «Сообщение» before doing the add could prevent overflow errors.

Сложение двух типов может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед сложением.

Hint: Converting the operands to «Сообщение» before doing the subtract could prevent overflow errors.

Вычитание между двумя типами может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед вычитанием.

Hint: Converting the operands to «Сообщение» before doing the multiply could prevent overflow errors.

Умножение между двумя типами может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед умножением.

Warning: Converting pointers to signed integers may result in wrong comparison results and range errors, use an unsigned

Виртуальное адресное пространство на виртуальных машинах располагается от $00000000 до $ffffffff. Многие операционные системы позволяют выделять память с адресами выше $80000000. Например, как WINDOWS, так и LINUX, допускают использование указателей в диапазоне от $0000000 до $bfffffff. Если вы преобразуете типы со знаком, это может вызвать ошибки переполнения и проверки диапазона, но также $80000000 < $7fffffff. Это может вызвать случайную ошибку в коде, подобно этому: «if p>q».

Error: Interface type Сообщение has no valid GUID

Если применяется оператор as для интерфейса или класса, то интерфейс (то есть правый операнд оператора as) должен иметь правильный GUID.

Error: Invalid selector name

Селектор Objective-C не может быть пустым, он должен быть правильным идентификатором или одинарным двоеточием, а если он содержит менее одного двоеточия, он также должен быть завершён.

Error: Expected Objective-C method, but got Сообщение

Селектор может быть создан только для методов Objective-C, не для любых других процедур/функций/методов.

Error: Expected Objective-C method or constant method name

Селектор может быть создан только для методов Objective-C, при задании имени используются строковые константы или идентификатор метода Objective-C, который является видимым из текущей области видимости.

Error: No type info available for this type

Информация о типах не генерируется для некоторых типов, таких как перечисления с пропусками в их диапазоне значений (включая перечисления, нижняя граница которых отлична от нуля).

Error: Ordinal or string expression expected

The expression must be an ordinal or string type.

Error: String expression expected

The expression must be a string type.

Warning: Converting 0 to NIL

Use NIL rather than 0 when initialising a pointer.

Error: Objective-C protocol type expected, but got ”arg1”

The compiler expected a protocol type name, but found something else.

Error: The type ”arg1” is not supported for interaction with the Objective-C runtime

Objective-C makes extensive use of run time type information (RTTI). This format is defined by the maintainers of the run time and can therefore not be adapted to all possible Object Pascal types. In particular, types that depend on reference counting by the compiler (such as ansistrings and certain kinds of interfaces) cannot be used as fields of Objective-C classes, cannot be directly passed to Objective-C methods, and cannot be encoded using objc_encode.

Error: Class or objcclass type expected, but got ”arg1”

It is only possible to create class reference types of class and objcclass

Error: Objcclass type expected

The compiler expected an objcclass type

Warning: Coerced univ parameter type in procedural variable may cause crash or memory corruption: arg1 to arg2

univ parameters are implicitly compatible with all types of the same size, also in procedural variable definitions. That means that the following code is legal, because single and longint have the same size:

{$mode macpas}

Type

  TIntProc = procedure (l: univ longint);

  procedure test(s: single);

    begin

      writeln(s);

    end;

  var

    p: TIntProc;

  begin

    p:=test;

    p(4);

  end.

This code may however crash on platforms that pass integers in registers and floating point values on the stack, because then the stack will be unbalanced. Note that this warning will not flagg all potentially dangerous situations. when test returns.

Error: Type parameters of specializations of generics cannot reference the currently specialized type

Recursive specializations of generics like Type MyType = specialize MyGeneric<MyType>; are not possible.

Error: Type parameters are not allowed on non-generic class/record/object procedure or function

Type parameters are only allowed for methods of generic classes, records or objects

Error: Generic declaration of ”arg1” differs from previous declaration

Generic declaration does not match the previous declaration

Error: Helper type expected

The compiler expected a class helper type.

Error: Record type expected

The compiler expected a record type.

Error: Derived class helper must extend a subclass of ”arg1” or the class itself

If a class helper inherits from another class helper the extended class must extend either the same class as the parent class helper or a subclass of it

Error: Derived record helper must extend ”arg1”

If a record helper inherits from another record helper it must extend the same record that the parent record helper extended.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;
 
type
  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label4: TLabel;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
uses Unit3;
 
{$R *.dfm}
 
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3.Show;
end;
 
procedure TForm2.Button2Click(Sender: TObject);
var A, B, C, D, E, F, Q, W, R, H: Extended;
begin
A:=StrToFloat(Edit1.Text);
B:=StrToFloat(Edit2.Text);
C:=StrToFloat(Edit3.Text);
case Button2.Tag of
0:
begin
D:=A+B;
Label11.Caption:=FloatToStr(RoundTo(D,-2));
end;
1:
begin
E:=A-B;
Label11.Caption:=FloatToStr(RoundTo(E,-2));
end;
2:
begin
F:=A/C*1000;
Label14.Caption:=FloatToStr(RoundTo(F,-2));
end;
3:
begin
Q:=B/C*1000;
Label13.Caption:=FloatToStr(RoundTo(Q,-2));
end;
4:
begin
W:=(A+B)/C*1000;
Label15.Caption:=FloatToStr(RoundTo(W,-2));
end;
5:
begin
R:=(A-B)/C*1000;
Label18.Caption:=FloatToStr(RoundTo(R,-2));
end;
6:
begin
H:=A/B*1000;
Label19.Caption:=FloatToStr(RoundTo(H,-2));
end;
Button2.Tag:=Button2.Tag+1;
end;
end;
end.

Часть II. Delphi

Enter

Получение элементом управления

фокуса

Exit

Потеря элементом управления

фокуса

Текст сообщения

Причина ошибки

Array type required

Требуется массив.

Assignment to FOR-Loop variable

Переменная — параметр цикла FOR

‘<Имя>’

не может изменяться внутри цикла.

Assignment to FOR-Loop variable

Переменная — параметра цикла

‘<Имя>’

FOR может иметь неопределённое

значение после выполнения этого

цикла.

Case label outside of range of case

Значения указанные в операторе

expression

CASE таковы, что селектор не может

их принимать.

Compile terminated by user

Компиляция прервана

пользователем клавишами Ctrl и

Break.

Constant expression expected

Ожидалось выражение состоящее

из одних констант.

Constant expression violates

Константное выражение выходит

subrange bounds

за пределы заданного интервала.

Could not create output file

Невозможно создать exe-файл.

Declaration of <Имя> differs from

Текущее декларирование

previous declaration

отличается от предыдущего.

Division by zero

Выполняется деление на нуль.

Duplicate case label

Значения в операторе CASE

повторяются.

EXCEPT or FINALLY expected

Ожидается секция исключений

оператора TRY.

Expression has no value

Выражение не возвращает после

себя никакого значения.

File not found: ‘<Имя_файла>.dcu’

Файл внешнего модуля не был

обнаружен в текущем каталоге.

Часть II. Delphi

File not found: <Имя_файла>

Не был найден указанный файл.

File type not allowed here

Файловый тип в данном месте не

позволителен. Файловая переменная

может передаваться в подпрограмму

только как параметр — переменная.

FOR-Loop variable ‘<Имя>’ cannot

Переменная — параметр цикла не

be passed as var parameter

может передаваться в подпрограмму

как параметр. Она должна быть

описана локально.

For loop control variable must be

Переменная — параметр цикла FOR

simple local variable

должна быть описана локально.

For loop control variable must have

Переменная параметра цикла FOR

ordinal type

может быть целого, символьного

либо перечислимого типов.

FOR or WHILE loop executes zero

Цикл FOR или WHILE не будет

times — deleted

выполняться ни разу и поэтому

удален.

Function needs result type

Была определена функция в

которой не определено

результирующее значение.

Identifier redeclared: ‘<Имя>’

Повторно был описан указанный

идентификатор. Все имена в

программе должны быть уникальны.

Illegal character in input file:

В программе были обнаружены

‘<Символ>’ ($)

недопустимые символы.

Illegal type in Read/Readln statement

Несовместимость типов при

вызове оператора ввода.

Illegal type in Write/Writeln statement

Несовместимость типов при

вызове оператора вывода.

Inaccessible value

Значение данной переменной не

доступно либо не определено.

Incompatible types

Несовместимость типов.

Incompatible types: ‘<Тип1>’ and

Имеет место несовместимость

‘<Тип2>’

указанных типов.

Internal error: <Код_ошибки>

Внутренняя ошибка.

Invalid function result type

Была определена функция, в

которой выходное значение не

совместимо по типу с указанным в

Часть II. Delphi

заголовке.

Label already defined:

Указанная метка уже была

‘<Имя_метки>’

определена.

Left side cannot be assigned to

Имеет место попытка изменить

значение константы.

Line too long (more than 255

Строка слишком длинна.

characters)

Low bound exceeds high bound

Нижняя граница диапазона

определена большей чем верхняя

граница.

Method identifier expected

Требуется указать название

метода.

Missing operator or semicolon

Пропущен оператор либо точка с

запятой.

Missing parameter type

Формальные параметры

подпрограммы даны без указания

типов.

Not enough actual parameters

При вызове какой — либо

процедуры или функции было

указано недостаточное количество

фактических параметров.

Object type required

Требуется объект.

Operator not applicable to this

Оператор не предназначен для

operand type

работы с операндами данного типа.

Ordinal type required

В данном месте требуется

скалярный тип.

Pointer type required

Требуется указатель.

Procedure cannot have a result type

Процедура не может иметь

результирующего значения. В таких

случаях нужно использовать

функцию.

PROCEDURE or FUNCTION

В данном месте ожидается

expected

процедура либо функция.

Record, object or class type required

Требуется запись, объект или

класс.

Return value of function

Выходное значение указанной

‘<Имя_функции>’ might be undefined

функции может быть не определено.

Statement expected, but expression

Ожидался оператор, но было

Часть II. Delphi

of type ‘<Тип>’ found

обнаружено выражение указанного

типа.

String constant truncated to fit

Строковая константа укорочена.

STRING[<Номер>]

Syntax error in real number

Ошибка при написании

действительного числа.

Text after final ‘END.’ — ignored by

Текст, написанный в программе

compiler

после последнего END был

игнорирован.

Too many actual parameters

При вызове какой — либо

процедуры или функции было

указано слишком большое

количество фактических

параметров.

Type of expression must be

Тип выражения должен быть

BOOLEAN

логическим. Имеет место

несовместимость типов.

Type of expression must be

Тип выражения должен быть

INTEGER

целым. Имеет место

несовместимость типов.

Types of actual and formal var

Типы формальных и фактических

parameters must be identical

параметров должны совпадать.

Incompatible types

Несовместимые типы. В

инструкции присваивания тип

выражения не соответствует или не

может быть приведен к типу

переменной, получающей значение

выражения.

Тип фактического параметра

процедуры или функции не

соответствует или не может быть

приведен к типу формального

параметра

Undeclared identifier: ‘<Имя>’

Неизвестный идентификатор,

либо оператор написан с ошибкой.

Unexpected end of file in comment

Комментарий начатый в

started on line <Номер>

указанной строке не закрыт.

Hi there,

const-correctness and static member variables are domains of the language I haven’t entirely grasped. I’m working on a larger project, but the following is a snippet of a dummy project which reproduces the same error:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace Test {

	const __int64 num_channels = 2;
	const __int64 samplerate = 44100;
	const __int64 tempo = 120;
	const __int64 num_seconds_in_minute = 60;
	const __int64 num_beats_per_bar = 4;
	const __int64 num_seconds_in_buffer = ((double)num_beats_per_bar / ((double)tempo / (double)num_seconds_in_minute));

	typedef __int16 BitDepth;

	class Buffer {
	public :
		Buffer() {}

		const static __int64 num_samples = num_seconds_in_buffer * samplerate * num_channels;
		BitDepth samples[num_samples];
	};
}

int main() {

	Test::Buffer buffer;

	return 0;
}

The error(s):

main.cpp(16): error C2057: expected constant expression
main.cpp(17): error C2057: expected constant expression

It’s referring to the const static member num_samples. This isn’t making any sense to me. It’s this exact problem that others have tried to explain to me in the past, but I can’t wrap my head around it. Could someone explain it to me like I’m five? Thanks.

NOTE: my compiler doesn’t support constexpr.

Last edited on

What version of Visual Studio are you using?

I’m using Visual Studio Community 2013, but I’m in the process of installing Visual Studio Community 2015…

The problem seems to be with this line const __int64 num_seconds_in_buffer = ((double)num_beats_per_bar / ((double)tempo / (double)num_seconds_in_minute));

Removing the casts the code compiles with VS2015.

Removing the casts the code compiles also with VS2013.

Hi,

I made use of constexpr , and it works with the casts (I tested with both C and C++ casts):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <cstdint>

namespace Test {

    constexpr std::size_t num_channels = 2;
    constexpr std::size_t samplerate = 44100;
    constexpr std::size_t tempo = 120;
    constexpr std::size_t num_seconds_in_minute = 60;
    constexpr std::size_t num_beats_per_bar = 4;
//    constexpr ___int64 num_seconds_in_buffer = ((double)num_beats_per_bar / ((double)tempo / (double)num_seconds_in_minute));
    constexpr double num_seconds_in_buffer = (
                static_cast<double>(num_beats_per_bar) / ( static_cast<double>(tempo)
                                             /  static_cast<double>(num_seconds_in_minute) )

                );
//    typedef __int16 BitDepth;
    using BitDepth = uint16_t;

    class Buffer {
    public :
        Buffer() {}

        constexpr static std::size_t num_samples = num_seconds_in_buffer * samplerate * num_channels;
        BitDepth samples[num_samples];

        std::size_t get_num_samples() {
            return num_samples;
        }
    };
}

int main() {

    Test::Buffer buffer;

    std::cout << "Number of Samples is " << buffer.get_num_samples() << "n";

    return 0;
}

You had __int64 when It should have been double on line 8 (your code), the current numbers work with an integer type and the casts but what if they change and you have a fraction?

I reckon this might work because constexpr is set in stone at compile time. Mind though I am using clang++ 3.7 with gcc5.3 c++14 on Linux , not sure of the vagaries of VS in terms of whether all the bugs are ironed out yet. I mean, I just don’t know — I am a Linux person :+)

I didn’t have a __int64 so I used std::size_t , but your type might be signed.

Any reason to not use static_cast<double>() instead of the C casts? I just tested with them: it worked.
Output:

Number of num_seconds_in_buffer is 2
Number of Samples is 176400

Edit: Whoops changed return type to double :+)

Hang on having a discombobulation numbers don’t agree with my calculator

C++ was right the whole time, just the operator of the calculator was discombobulated !!

Hope this is all good for ya now !!

Last edited on

There is no difference between

const std::int64_t a = 200 ;

and

constexpr std::int64_t a = 200 ;

In both,

(a)

is an integral constant expression.

There is a difference between

const double c = double(a) / 2.3 ;

and

constexpr double c = double(a) / 2.3 ;

The former is («as-if») evaluated at run-time; the latter is evaluated at compile-time and is a constant expression.

With -std=c++14 -pedantic errors

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdint>

namespace Test
{
    const std::int64_t a = 200 ;
    int test_a[ a+2 ] {} ; // fine: a+2 is an integral constant expression

    constexpr std::int64_t b = 200 ;
    int test_b[ b+2 ] {} ; // fine: b+2 is an integral constant expression

    constexpr double c = double(a) / 2.3 ; // evaluated at compile-time
    // note: the compile-time evaluation of a floating point expressions may yield a result
    // that is different from the evaluation of the same operations on the same values at run-time.
    int test_c[ int(c) ] {}; // fine: int(c) is an integral constant expression

    const double d = double(a) / 2.3 ; // (semantically) evaluated at run-time
    int test_d[ int(d) ] {} ; // *** error: int(d) is not an integral constant expression
                              // note: the default GNU compiler is non-conforming wrt this
                              // with g++ / g++-compatible implementations, compile with
                              // -std=c++14 -pedantic errors to force conformance with standard C++
}

http://coliru.stacked-crooked.com/a/b18b3147208a8a34

JLBorges wrote:
The former is («as-if») evaluated at run-time; the latter is evaluated at compile-time and is a constant expression.

Ok, I thought understood that, but I didn’t realise it

produced different results

:+(

And it was wrong of me to suggest that might have been part of the problem.

However what about this part?

TheIdeasMan wrote:
You had __int64 when It should have been double on line 8 (your code), the current numbers work with an integer type and the casts but what if they change and you have a fraction?

Further, removing the casts to double would produce integer division. I know you weren’t proposing that, but others were.

1
2
// with g++ / g++-compatible implementations, compile with
// -std=c++14 -pedantic errors to force conformance with standard C++ 

I compile with this these days, qmake adds a bunch of other stuff too:

clang++  -std=c++14 -Wall -W -Wextra -pedantic-errors -Wswitch-default -Wswitch-enum -Wunused -Wfloat-equal -Wconversion -Wzero-as-null-pointer-constant -Weffc++

// note: the compile-time evaluation of a floating point expressions may yield a result
// that is different from the evaluation of the same operations on the same values at run-time

.

Well, that’s a bit of a worry :+| How does that come about? Noted that you say may , but I wonder how much of a difference? Would extending the type to long double, multi-precision or exact decimal make any difference? If a fix is needed that is. It may not be so bad if a type change fixes it, or if one of const or constexpr proves to be better than the other.

I have some code that has a heap of constexpr in the initialisations of crucial values: for some of them up to 13sf or possibly more are required to be accurate. If it’s going to be an issue I might have to do some analysis to see just how precise these values have to be. Probably good to know anyway. The first few of these initial values go on to participate in dozens of other expressions. So far testing with one set of values seems to have worked, but I am not around to any serious & thorough testing yet. I have to investigate the best way of doing that.

IIRC, the reason why I used constexpr was that I had just read an article by Herb Sutter saying to use auto, constexpr and brace initialisation as much as possible.

If you have lots of spare time, here is the link to the manual:

http://www.icsm.gov.au/gda/gdatm/gdav2.3.pdf

I have worked on Chapter 4, page 20 of the pdf (pg15, the document) Vincenty Inverse.

Probably only have to look at that one page to see the sort of things that go on :+)

One quick example is the Lat & Long values. They are expressed to 5dp of 1 arc-second (<1mm in position), in radians that is 4.848e-11. probably want 3 or 4 more dp if one is to do calcs with those, so that 15sf.

Co-ordinates (ECEF Cartesian and Plane) are expressed to the millimetre with 10sf

Any way it’s late my end, Thanks again for all your help.

> but I didn’t realise it produced different results

The IS has this footnote:
Nonetheless, implementations are encouraged to provide consistent results, irrespective of whether the evaluation was performed during translation and/or during program execution.

It won’t produce different results if the compile-time floating point environment is the same as the run-time floating point environment. These need not be the same if we are cross-compiling for a different hardware architecture. IEEE 754 floating point is widely adopted; so in most cases, this is not a concern.

Thanks to everyone for their input! Ultimately, I was able to resolve my problem!

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Error connection with ssl alert protocol version
  • Error compiling movie accelerated render error unable to produce frame
  • Error connection to localhost failed vesta
  • Error compiling for board arduino nano
  • Error connection to api server failed http api hiveos farm

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии