Ошибка в delphi incompatible types

Gorev

135 / 132 / 30

Регистрация: 08.12.2009

Сообщений: 565

Записей в блоге: 3

1

18.06.2012, 17:37. Показов 10500. Ответов 12

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем привет. В общем у меня следущая проблема.
Вот тип переменной:

Pascal
1
  n1,n2,i,it1:integer;

А вот код, где вылазиет ошибка Incompatible types возле переменной (n1).

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
{High kard-Высшая карта}
for i:=3 to 7 do
 begin
  if zn[1]<>zn[i] then n1:=n1+1;
  if zn[2]<>zn[i] then inc(n1);
  if n1=10 then
   begin
    if zn[1]>=zn[2] then label5.Caption:='Высшая карта'+inttostr(zn[1]);
    else label5.Caption:='Высшая карта'+inttostr(zn[2]);
 
   end;
 end;
{High kard-Высшая карта}

Помогите пожалуйста, никак не могу разобраться.

Добавлено через 1 минуту
Incompatible types в переводе через google переводчик означает «Несовместимые типы» если что.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

18.06.2012, 17:37

Ответы с готовыми решениями:

Incompatible types
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,…

Incompatible types
Необходимо было сделать программу, решающую методом крамера слау. Я позаимствовал кусок кода из…

Incompatible types
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x,y,z,a:Integer;

begin

Incompatible types
Пишет Unit1.pas(124): Incompatible types в месте обозначенном комментарием, помогите разобраться в…

12

36 / 36 / 10

Регистрация: 22.02.2012

Сообщений: 71

18.06.2012, 17:42

2

Чем является zn? В какой конкретно строчке ошибка?



0



135 / 132 / 30

Регистрация: 08.12.2009

Сообщений: 565

Записей в блоге: 3

18.06.2012, 17:46

 [ТС]

3

zn-одномерный массив, ошибка в четвертой строчке.



0



36 / 36 / 10

Регистрация: 22.02.2012

Сообщений: 71

18.06.2012, 17:48

4

Ясное дело, что одномерный массив, но из чего? Из integer?

Поковырял код внимательней, эту ошибку не нашёл, но нашёл такую: в 8 строчке «;» не нужна: перед else точка с запятой не ставится.

UPD: в четвёртой строчке? Не вижу. О_о
Кроме того, если исправить то, что я сказал, то код прекрасно компилируется. При zn: array[1..10] of integer.



1



Gorev

135 / 132 / 30

Регистрация: 08.12.2009

Сообщений: 565

Записей в блоге: 3

18.06.2012, 17:53

 [ТС]

5

Цитата
Сообщение от Facenapalm
Посмотреть сообщение

Ясное дело, что одномерный массив, но из чего? Из integer?

Поковырял код внимательней, эту ошибку не нашёл, но нашёл такую: в 8 строчке «;» не нужна: перед else точка с запятой не ставится.

Pascal
1
 zn,pr,mas: array [1..52] of integer;

он просто в другом модуле, забыл написать.

Добавлено через 36 секунд

Цитата
Сообщение от Facenapalm
Посмотреть сообщение

Поковырял код внимательней, эту ошибку не нашёл, но нашёл такую: в 8 строчке «;» не нужна: перед else точка с запятой не ставится.

Я в курсе, но всеравно спасибо за помощь=)



0



36 / 36 / 10

Регистрация: 22.02.2012

Сообщений: 71

18.06.2012, 17:55

6

Странно, очень странно, у меня всё скомпилировалось. Единственное, что приходит на ум — это то, что у тебя в функции или в этом модуле объявлено что-либо, что перекрывает одну из этих переменных (то бишь имеет то же имя: n1, n2, i, it1 или zn) и не является целочисленной переменной. Прогони по поиску.
Больше ничего сказать не могу. А, иногда Делфи не верно указывает, в какой строчке ошибка. А здесь я уверен: всё правильно.



1



135 / 132 / 30

Регистрация: 08.12.2009

Сообщений: 565

Записей в блоге: 3

18.06.2012, 17:56

 [ТС]

7

Сейчас скрин пришлю



0



Facenapalm

18.06.2012, 18:02

Не по теме:

Я верю, что Делфи показывает именно эту строку. Но говорю по собственному опыту: бывают ситуации, когда она показывает неправильно. Очень редки, но бывают.



0



135 / 132 / 30

Регистрация: 08.12.2009

Сообщений: 565

Записей в блоге: 3

18.06.2012, 18:03

 [ТС]

9

Только это Делфи 7 а не паскаль, но суть одна и та же.

Миниатюры

Incompatible types
 



0



36 / 36 / 10

Регистрация: 22.02.2012

Сообщений: 71

18.06.2012, 18:07

10

Не по теме:

Да, я уже понял, что Делфи, меня сбило название раздела. :)

Кинь-ка весь проект, если исходник не секрет.



1



135 / 132 / 30

Регистрация: 08.12.2009

Сообщений: 565

Записей в блоге: 3

18.06.2012, 18:17

 [ТС]

11

Цитата
Сообщение от Facenapalm
Посмотреть сообщение

Кинь-ка весь проект, если исходник не секрет.

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

Добавлено через 5 минут
Facenapalm, кстати, коль вы так заинтересовались проектом, могу предложить поработать над ним совместно, мне как раз нужны смышленые люди.



0



36 / 36 / 10

Регистрация: 22.02.2012

Сообщений: 71

18.06.2012, 18:19

12

Тогда, пардон, ничем, кроме вышеназванных советов помочь не могу.
Что-то не понял фразы «я его своей головой делал». Тут никто исходники воровать не планирует.

Цитата
Сообщение от Gorev
Посмотреть сообщение

Facenapalm, кстати, коль вы так заинтересовались проектом, могу предложить поработать над ним совместно, мне как раз нужны смышленые люди.

Нет, я проектом не заинтересовался, я вообще правила покера не знаю.
Проект предложил скинуть исключительно для того, чтобы помочь найти ошибку.
«Смышлёные люди» — это громко сказано. Я вообще слабый программист.



1



135 / 132 / 30

Регистрация: 08.12.2009

Сообщений: 565

Записей в блоге: 3

18.06.2012, 18:30

 [ТС]

13

Цитата
Сообщение от Facenapalm
Посмотреть сообщение

Я вообще слабый программист.

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

Добавлено через 6 минут
Facenapalm, Кстати, я разобрался. Оказывается n1 уменя есть ещё и в меню один из итемов. В общем спасибо=)



0



У вас ошибка в преобразовании переменной k в целое. Вот как объявлена функция Int:

function Int(const X: Extended): Extended;

А вот, как она описывается:

Функция Int возвращает целочисленную часть числа с плавающей точкой,
как число с плавающей точкой.

Очевидно, что эта функция не подходит для того, чтобы преобразовать Real в Integer (а цикл for работает именно с Integer). Для такого преобразования вам надо использовать либо функцию Trunc (которая делает то же самое, что и Int, только результатом будет Integer), либо Round, которая округляет число до целого.

function Trunc (const Number : Extended): Integer;
function Round (const Number : Extended): Int64;

Примеры:

begin
  ShowMessage('Round(12.75) = ' + IntToStr(Round(12.75)));
  ShowMessage('Trunc(12.75) = ' + IntToStr(Trunc(12.75)));
  ShowMessage('  Int(12.75) = ' + FloatToStr(Int(12.75)));
  ShowMessage(' Frac(12.75) = ' + FloatToStr(Frac(12.75)));
end;

Выведет:

Round(12.75) = 13
Trunc(12.75) = 12
Int(12.75) = 12
Frac(12.75) = 0.75

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

for I := 1 to Trunc(K) do begin
  L := L * I;
end

Go Up to Error and Warning Messages (Delphi)

This error message occurs when the compiler expected two types to be compatible (meaning very similar), but in fact, they turned out to be different. This error occurs in many different situations — for example when a read or write clause in a property mentions a method whose parameter list does not match the property, or when a parameter to a standard procedure or function is of the wrong type.

This error can also occur when two units both declare a type of the same name. When a procedure from an imported unit has a parameter of the same-named type, and a variable of the same-named type is passed to that procedure, the error could occur.

unit unit1;
interface
  type
    ExportedType = (alpha, beta, gamma);

implementation
begin
end.

unit unit2;
interface
  type
    ExportedType = (alpha, beta, gamma);

  procedure ExportedProcedure(v : ExportedType);

implementation
  procedure ExportedProcedure(v : ExportedType);
  begin
  end;

begin
end.

program Produce;
uses unit1, unit2;

var
  A: array [0..9] of char;
  I: Integer;
  V : ExportedType;
begin
  ExportedProcedure(v);
  I:= Hi(A);
end.

The standard function Hi expects an argument of type Integer or Word, but we supplied an array instead. In the call to ExportedProcedure, V actually is of type unit1.ExportedType since unit1 is imported prior to unit2, so an error will occur.

unit unit1;
interface
  type
    ExportedType = (alpha, beta, gamma);

implementation
begin
end.

unit unit2;
interface
  type
    ExportedType = (alpha, beta, gamma);

  procedure ExportedProcedure(v : ExportedType);

implementation
  procedure ExportedProcedure(v : ExportedType);
  begin
  end;

begin
end.

program Solve;
uses unit1, unit2;
var
  A: array [0..9] of char;
  I: Integer;
  V : unit2.ExportedType;
begin
  ExportedProcedure(v);
  I:= High(A);
end.

We really meant to use the standard function High, not Hi. For the ExportedProcedure call, there are two alternative solutions. First, you could alter the order of the uses clause, but it could also cause similar errors to occur. A more robust solution is to fully qualify the type name with the unit which declared the desired type, as has been done with the declaration for V above.

Типов сообщений компилятора — более двухсот. Рассмотрим перечень наиболее встречающихся сообщений класса 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, в случае если делитель — константное выражение.

Delphi Compiler Error

E2010 Incompatible types – ‘%s’ and ‘%s’

Reason for the Error & Solution

This error message results when the compiler expected two types to be compatible (or similar), but they turned out to be different.

In general, you have to look at your program very carefully to decide how to resolve type incompatibilities.

If you receive the following error message:

[DCC Error] Project1.dpr(8): E2010 Incompatible types: 'Integer' and 'Extended'

The first type in this message (Integer) is the type expected, and the second type (Extended) is the type that was given. An Extended type cannot be accommodated as an Integer.

Here is another example:

 
 program Produce;
 
 procedure Proc(I: Integer);
 begin
 end;
 
 begin
   Proc( 22 / 7 ); (*Result of / operator is Real*)
 end.

The programmer thought the division operator /, which is used in C++, would yield an integral result — but this is not the case in Delphi.

The solution in this case is to use the integral division operator div:

  
 program Solve;
 
 procedure Proc(I: Integer);
 begin
 end;
 
 begin
   Proc( 22 div 7 ); (*The div operator gives result type Integer*)
 end.

Other examples include:

  • with pointer incompatible with ^Integer
  • Generics: Object<T1> incompatible with TObject<T2>

See Also

Понравилась статья? Поделить с друзьями:
  • Ошибка в cod cold war
  • Ошибка в death stranding c0000005h
  • Ошибка в city car driving starter application
  • Ошибка в dead rising 2 off the record
  • Ошибка в apex legends мошенничество