Error incompatible types got boolean expected int64

Error: Incompatible types: got "Boolean" expected "Int64" Turbo Pascal Решение и ответ на вопрос 951045

Progers

New to C++

83 / 44 / 10

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

Сообщений: 258

1

09.09.2013, 21:39. Показов 14626. Ответов 3

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


Здравствуйте, возникла ошибка в программе project1.lpr(43,6) Error: Incompatible types: got «Boolean» expected «Int64»
Вот код:

Pascal
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
 uses CRT;
Label m1,m2;
var
 ans : char;
 ch : integer;
 function algorythm(var a1,b1,c1: double) : double;
 begin
 algorythm := a1/(b1+c1);
 end;
 function first_algo() : double;
var a,b,x,c,e,alg : double;
 begin
 writeln('Enter a');
 readln(a);
 writeln('Enter b');
 readln(b);
 writeln('Enter c');
 readln(c);
 writeln('Enter e');
 readln(e);
 alg:= algorythm(a,b,c);
 x:= (e * alg) + sqrt(sqr(a) + sqr(b)) - (1 / ((c * c * c)+(a * b)));
 writeln('Answer = ', x);
 end;
   function second_algo() : double;
var a,b,y : double;
   begin
   writeln('Enter a');
 readln(a);
 writeln('Enter b');
 readln(b);
 y:= sin(a)+(sqrt(cos(sqr(b)))) - (sin(a)/cos(b));
 writeln('The answer: ',y);
   end;
function third_algo() : integer;
var x,y : integer;
begin
m2:
writeln('Enter a');
readln(x);
writeln('Enter b');
readln(y);
if x < 10 and x < -10 and y < 10  then
writeln('False')
else
writeln('True');
 
end;
 
 
 begin
 m1:
 clrscr;
 writeln('Hello, Choose:');
 writeln('1 or 2');
 readln(ch);
 if ch = 1 then
 first_algo()
 else if ch = 2 then
 second_algo()
 else if ch = 3 then
 
 else
 exit();
 writeln('Do you want to continue? y/n');
 readln(ans);
 if ans = 'y' then
 goto m1
else
    end.
 readln;
 end.

Помогите решить ошибку.

Добавлено через 57 секунд
Ошибка на 44 строке

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

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

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

09.09.2013, 21:39

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

Error: Incompatible types: got «Extended» expected «SmallInt»
Задание. Написать программу решения задачи, используя функции: в основной функции вычислить с…

got «Boolean» expected «LongInt»
var
a,i,c,n:integer;
begin
c:=0;
read(n);
for i:=1 to n do
begin
read(a);
if
a mod 10&lt;&gt;5

Составить фразу «письменный стол» из слов «тесненный», «полка», «речь», «миф».
1) Составить фразу &quot;письменный стол&quot; из слов &quot;тесненный&quot;, &quot;полка&quot;, &quot;речь&quot;, &quot;миф&quot;.
2) Вывести…

Составить фразу «текстовый редактор» из слов «тесто», «редакция», «мотор», «который»
1) Составить фразу &quot;текстовый редактор&quot; из слов &quot;тесто&quot;, &quot;редакция&quot;, &quot;мотор&quot;, &quot;который&quot;.

3

Topic: [SOLVED] incompatible types: got boolean expected int64 pascal  (Read 9917 times)

Hello, I’m new to pascal and i was doing my program and that error showed up, can anyone help me?
Program Pitagoras;
Var a, b, c, d:integer;
 Begin
 Writeln(‘Introduza três valores’);
 Read(a,b,c);
 if b>a and b>c then (d)
 else
 if c>a and c>b then (d)
 else
 if a>b and a>c then (d);
 writeln(‘O maior número é: ‘,d)
 End.
(Yes this is on portuguese, just focus on the commands, and yeah i know this is probably really bad lol)

« Last Edit: February 15, 2017, 11:46:38 pm by SouLy »


Logged


Change this:

if b>a and b>c then (d)
 else
 if c>a and c>b then (d)
 else
 if a>b and a>c then (d);

Into:

if (b>a) and (b>c) then (d)
 else
 if (c>a) and (c>b) then (d)
 else
 if (a>b) and (a>c) then (d);

Bart


Logged


Now it shows up 3 Illegal expression errors, what do i need to do? :/


Logged


Now it shows up 3 Illegal expression errors, what do i need to do? :/

I think you want

  1. program Pitagoras;

  2. var a, b, c, d: integer;

  3. begin

  4. Writeln(‘Introduza três valores’);

  5. Read(a,b,c);

  6. if (b > a) and (b > c) then

  7.     d := b

  8. else

  9. if (c > a) and (c > b) then

  10.       d := c

  11. else

  12. if (a > b) and (a > c) then

  13.         d := a;

  14. WriteLn(‘O maior número é: ‘,d);

  15. end.


Logged


I’m new to pascal and i was doing my program and that error showed up, can anyone help me?

You declared ‘d’ as an Integer, but you are not assigning any value to it.  The statement ‘(d)’ is meaningless.  I think you meant to do something more like this instead:

Program Pitagoras;

var
  a, b, c, d: integer;

begin
  Writeln('Introduza três valores');
  Read(a, b, c);
  if (b > a) and (b > c) then
    d := b
  else if (c > a) and (c > b) then
    d := c
  else
    d := a;
  Writeln('O maior número é: ', d);
end.


Which can be simplified by using the Math.Max() function:

Program Pitagoras;

uses
  math;

var
  a, b, c, d: integer;

begin
  Writeln('Introduza três valores');
  Read(a, b, c);
  d := max(max(a, b), c);
  Writeln('O maior número é: ', d);
end.


Logged


See if the example below helps you:

  1. program Pitagoras;

  2. var

  3.   a, b, c, d: Integer;

  4. begin

  5. {

  6.   Help about the command Read

  7.   Read from a text file into variable

  8.   Description

  9.   Read reads one or more values from a file F, and stores the result in V1, V2, etc.; If no file F is specified, then standard input is read. If F is of type Text, then the variables V1, V2 etc. must be of type Char, Integer, Real, String. If F is a typed file, then each of the variables must be of the type specified in the declaration of F. Untyped files are not allowed as an argument.

  10.   *** In earlier versions of FPC, it was also allowed to read Pchar null-terminated strings, but this has been removed, since there is no buffer checking possible.

  11.   Documentation generated on: Aug 02 2012

  12.   }

  13. WriteLn(‘Introduza três valores: ‘);

  14. // Read(a,b,c);

  15.   a := 1; b := 2; c := 3;

  16. // a := 2; b := 3; c := 1;

  17. // a := 3; b := 1; c := 2;

  18. if ((b>a) and (b>c)) then

  19.     d := b

  20. else

  21. if ((c>a) and (c>b)) then

  22.       d := c

  23. else

  24. if ((a>b) and (a>c)) then

  25.       d := a;

  26. WriteLn(‘Os três números são: ‘ + LineEnding +

  27. ‘a: ‘, a, ‘   b: ‘, b, ‘   c: ‘, c, LineEnding +

  28. ‘O maior número é: ‘, d);

  29. ReadLn;

  30. end.

« Last Edit: February 15, 2017, 02:37:43 am by valdir.marcos »


Logged


...
a := 1;  b := 1;  c := 1;
...
O:-)


Logged

All posts based on: Win10 (Win64); Lazarus 2.0.10 ‘stable’ (x64) unless specified otherwise…


>
Error: Incompatible types: got «Boolean» expected «Int 64»
, Вот такую ошибку выдает

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
26.08.09, 08:59

    Senior Member

    ****

    Рейтинг (т): 13

    Кусок функции, которая реализуется в программе

    ExpandedWrap disabled

      Function Pristavka(q : Real) : string;

      Var znak : string;

      begin

      ….

      if (q>=1000000000) and (1000000000000) then if (q>=1000000000) and (q<10000000000) then begin

                                                                                              Str((q/1000000000):3:2,znak);

                                                                                              Pristavka:=znak+TextRus(‘ ѓЋ¬’);

                                                                                              end

                                             else if (q>=10000000000) and (q<100000000000) then begin

                                                                                                Str((q/1000000000):4:2,znak);

                                                                                                Pristavka:=znak+TextRus(‘ ѓЋ¬’);

                                                                                                end

                                             else if (q>=100000000000) and (q<1000000000000) then begin

                                                                                                  Str((q/1000000000):5:2,znak);

                                                                                                  Pristavka:=znak+TextRus(‘ ѓЋ¬’);

                                                                                                  end;

      end;

    Место ошибки указано на месте открывающейся скобки после if. В чем причина? Откуда взялся тип Boolean?

    Компилятор FPC 2.2.2

    Сообщение отредактировано: Polinom2686 — 26.08.09, 09:04

    Guru

    volvo877



    Сообщ.
    #2

    ,
    26.08.09, 09:04

      Moderator

      *******

      Рейтинг (т): 878

      Цитата Polinom2686 @ 26.08.09, 08:59

      ExpandedWrap disabled

        if (q>=1000000000) and (1000000000000)

      Что должно означать это условие? В первой скобке — Boolean (после сравнения — либо True, либо False), а во второй что? Компилятор прав, If не может работать с другими типами, только Boolean…


      Polinom2686



      Сообщ.
      #3

      ,
      26.08.09, 09:08

        Senior Member

        ****

        Рейтинг (т): 13

        volvo877, ты меня спас. Это моя невнимательность. :wall:

        Вот так должно выглядеть.

        ExpandedWrap disabled

          if (q>=1000000000) and (q<1000000000000)

        СПАСИБО !!! Разумеется теперь все работает.

        Сообщение отредактировано: Polinom2686 — 26.08.09, 09:08

        Guru

        volvo877



        Сообщ.
        #4

        ,
        26.08.09, 09:21

          Moderator

          *******

          Рейтинг (т): 878

          Polinom2686, а ты в ноликах не путаешься? Я бы, пока не поздно, написал бы по-другому:

          ExpandedWrap disabled

            Function Pristavka(q : Real) : string;

            const

              Mlrd = 1000000000;

            Var

              znak : string;

            begin

               if (q>=Mlrd) and (q < 1000 * Mlrd) then

               begin

                  Str((q/Mlrd):3:2,znak);

                  if (q>=Mlrd) and (q<10*Mlrd) then

                  begin

                     Pristavka:=znak+TextRus(‘ кракозябры№1 ‘);

                  end

                  else

                     if (q>=10*Mlrd) and (q<100*Mlrd) then

                     begin

                        Pristavka:=znak+TextRus(‘ кракозябры№2 ‘);

                     end

                     else

                        if (q>=100*Mlrd) and (q<1000*Mlrd) then

                        begin

                           Pristavka:=znak+TextRus(‘ кракозябры№3 ‘);

                        end;

               end;

            end;

          Проще разобраться, где какое число, не правда ли? :)


          Polinom2686



          Сообщ.
          #5

          ,
          26.08.09, 09:35

            Senior Member

            ****

            Рейтинг (т): 13

            Нет, не путаюсь. Спасибо за идею, но мне кажется в данном случае она мне не пригодится. Работоспособность и правильность работы функции уже проверена, а изменять эту функцию мне не нужно.
            Плюс, выполнять лишние действия (умножение внутри скобок) мне ни к чему, эта функция будет довольно часто использоваться. А так, еще раз спасибо.

            Guru

            volvo877



            Сообщ.
            #6

            ,
            26.08.09, 09:37

              Moderator

              *******

              Рейтинг (т): 878

              Цитата Polinom2686 @ 26.08.09, 09:35

              Плюс, выполнять лишние действия (умножение внутри скобок) мне ни к чему, эта функция будет довольно часто использоваться.

              Умножение выполнится еще на этапе компиляции, ты за кого вообще FPC держишь? Mlrd описан как Const все-таки…


              Polinom2686



              Сообщ.
              #7

              ,
              26.08.09, 09:42

                Senior Member

                ****

                Рейтинг (т): 13

                Цитата volvo877 @ 26.08.09, 09:37

                Цитата (Polinom2686 @ Сегодня, 12:35)
                Плюс, выполнять лишние действия (умножение внутри скобок) мне ни к чему, эта функция будет довольно часто использоваться.
                Умножение выполнится еще на этапе компиляции, ты за кого вообще FPC держишь? Mlrd описан как Const все-таки…

                Я же любитель, а не профессионал. :)
                Много чего могу и не знать. ;)

                Добавлено 26.08.09, 09:44
                Не серчай на меня. (Don’t worry, be happy :whistle: )


                miksayer



                Сообщ.
                #8

                ,
                26.08.09, 19:39

                  Цитата Polinom2686 @ 26.08.09, 09:35

                  Нет, не путаюсь. Спасибо за идею, но мне кажется в данном случае она мне не пригодится. Работоспособность и правильность работы функции уже проверена, а изменять эту функцию мне не нужно.

                  а представь, что кто-то потом будет читать твой код(только не говори, что этот код никто кроме тебя читать не будет, даже если и так, то нужно приучивать красиво писать код)? у меня, например, в глазах рябит от этих нулей. Вообще все это дело называется «магические числа»


                  Polinom2686



                  Сообщ.
                  #9

                  ,
                  27.08.09, 06:33

                    Senior Member

                    ****

                    Рейтинг (т): 13

                    Цитата miksayer @ 26.08.09, 19:39

                    Цитата (Polinom2686 @ Вчера, 12:35)
                    Нет, не путаюсь. Спасибо за идею, но мне кажется в данном случае она мне не пригодится. Работоспособность и правильность работы функции уже проверена, а изменять эту функцию мне не нужно.

                    а представь, что кто-то потом будет читать твой код(только не говори, что этот код никто кроме тебя читать не будет, даже если и так, то нужно приучивать красиво писать код)? у меня, например, в глазах рябит от этих нулей. Вообще все это дело называется «магические числа»

                    Вот как раз этот код никто кроме меня читать не будет :). Тот для кого программа предназначена, программированием не интересуется. Эта программа из разряда «сделать и забыть». ;)

                    Цитата miksayer @ 26.08.09, 19:39

                    у меня, например, в глазах рябит от этих нулей.

                    Это уже ваши проблемы, я нули нормально воспринимаю, не даром на инженера связиста учусь :).

                    Добавлено 27.08.09, 07:14
                    Причем здесь вообще магические числа?

                    Guru

                    volvo877



                    Сообщ.
                    #10

                    ,
                    27.08.09, 08:01

                      Moderator

                      *******

                      Рейтинг (т): 878

                      Цитата Polinom2686 @ 27.08.09, 06:33

                      не даром на инженера связиста учусь

                      Но остальные же не учатся на связистов, что, они должны ломать глаза? Ладно было бы как в некоторых языках: 10_000_000_000 — никаких проблем с восприятием. Но просто нули, подряд… :wacko:

                      Цитата Polinom2686 @ 27.08.09, 06:33

                      Эта программа из разряда «сделать и забыть»

                      <_< В следующий раз предупреждай, что тебе «просто заставить программу работать, а там — хоть трава не расти», я к таким программам (и «программистам» тоже) отношусь по-другому, для них есть специальный раздел.


                      Polinom2686



                      Сообщ.
                      #11

                      ,
                      27.08.09, 08:04

                        Senior Member

                        ****

                        Рейтинг (т): 13

                        Я очень рад, что я не «программист». :)

                        Сообщение отредактировано: Polinom2686 — 27.08.09, 10:35


                        Polinom2686



                        Сообщ.
                        #12

                        ,
                        27.08.09, 09:22

                          Senior Member

                          ****

                          Рейтинг (т): 13

                          Цитата volvo877 @ 27.08.09, 08:01

                          Но остальные же не учатся на связистов, что, они должны ломать глаза? Ладно было бы как в некоторых языках: 10_000_000_000 — никаких проблем с восприятием. Но просто нули, подряд… :wacko:

                          Я просто привык нули считать, поэтому у меня вопросов такие записи не вызывают.

                          Цитата volvo877 @ 27.08.09, 08:01

                          Цитата (Polinom2686 @ Сегодня, 09:33)
                          Эта программа из разряда «сделать и забыть»
                          <_< В следующий раз предупреждай, что тебе «просто заставить программу работать, а там — хоть трава не расти», я к таким программам (и «программистам» тоже) отношусь по-другому, для них есть специальный раздел.

                          Что за раздел?
                          А «сделать и забыть» из-за того что программа нужна в одном экземпляре (в крайнем случае не более 3-х).

                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                          0 пользователей:

                          • Предыдущая тема
                          • 32-битные компиляторы
                          • Следующая тема

                          [ Script execution time: 0,0551 ]   [ 16 queries used ]   [ Generated: 9.02.23, 14:03 GMT ]  

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

                          Сообщение

                          Описание

                          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.

                          На чтение 2 мин. Просмотров 155 Опубликовано 15.12.2019

                          I get this error on my insertion sort algorithm:

                          insertionsort.lpr(19,17) Error: Incompatible types: got «Boolean» expected «LongInt»

                          Here’s the line 19 of my code

                          I have tried googling all over the internet but i couldn’t find any syntax errors or anything.

                          Here’s the full code if it helps :

                          I also get the same error on the bubble sort algorithm i did. Here’s the error line

                          bubblesort.lpr(26,14) Error: Incompatible types: got «Boolean» expected «LongInt»

                          Here’s line 26 of my algorithm:

                          Here’s the full code:

                          1 Answer 1

                          In Pascal, boolean operators and and or have higher precedence than the comparison operators > , = , etc. So in the expression:

                          Given that and has higher precedence, Pascal sees this as:

                          0 and A[j] are evaluated as a bitwise and (since the arguments are integers) resulting in an integer. Then the comparison, j > (0 and A[j]) is evaluated as a boolean result, leaving a check of that with > key , which is boolean > longint . You then get the error that a longint is expected instead of the boolean for the arithmetic comparison.

                          The way to fix it is to parenthesize:

                          The same issue applies with this statement:

                          which yields an error because or is higher precedence than = . So you can parenthesize:

                          Or, more canonical for booleans:

                          When in doubt about the precedence of operators, parenthesizing is a good idea, as it removes the doubt about what order operations are going to occur.

                          var a, b, c, d, e :integer;

                          begin
                          readln (a);
                          b:= a mod 10;
                          c:= a mod 100 — b / 10;
                          d:= a div 100;
                          e:= b+c+d;
                          writeln (e);
                          end.

                          Error: Incompatible types: got «Extended» expected SmallInt.
                          Ашипка: Неподходящие типы: получил «Extended» вместо ожидаемого «SmallInt» 🙁

                          var a, b, c, delta, x1, x2 : integer

                          writeln(‘Tell me the value of a.’);

                          writeln(‘Tell me the valeu of b.’);

                          writeln(‘Tell me the value of c.’);

                          delta := (SQR(b) — 4*a*c);

                          2 Answers

                          The problem is caused by using floating point arithmetic when x1 is an integer.

                          Try using one of the following options:-

                          1. Use round(), floor(), trunc() type rounding functions

                          code becomes: «x1 := Round( (-b + SQRT(delta)) / 2*a );»

                          In Pascal, boolean operators and and or have higher precedence than the comparison operators >, =, etc. So in the expression:

                          while j > 0 and A[j] > key do
                          

                          Given that and has higher precedence, Pascal sees this as:

                          while (j > (0 and A[j])) > key do
                          

                          0 and A[j] are evaluated as a bitwise and (since the arguments are integers) resulting in an integer. Then the comparison, j > (0 and A[j]) is evaluated as a boolean result, leaving a check of that with > key, which is boolean > longint. You then get the error that a longint is expected instead of the boolean for the arithmetic comparison.

                          The way to fix it is to parenthesize:

                          while (j > 0) and (A[j] > key) do ...
                          

                          The same issue applies with this statement:

                          until flag = false or N = 1 ;
                          

                          which yields an error because or is higher precedence than =. So you can parenthesize:

                          until (flag = false) or (N = 1);
                          

                          Or, more canonical for booleans:

                          until not flag or (N = 1);    // NOTE: 'not' is higher precedence than 'or'
                          

                          When in doubt about the precedence of operators, parenthesizing is a good idea, as it removes the doubt about what order operations are going to occur.

                          I fixed that kind of errors:

                          baseform.pas(120,20) Error: Incompatible types: got «Boolean» expected «Int64»
                          baseform.pas(121,40) Error: Incompatible type for arg no. 2: Got «Boolean», expected «LongInt»
                          baseform.pas(240,6) Error: Incompatible types: got «Boolean» expected «Int64»
                          baseform.pas(241,13) Error: Incompatible type for arg no. 1: Got «ShortInt», expected «Boolean»
                          baseform.pas(251,17) Error: Incompatible type for arg no. 1: Got «ShortInt», expected «Boolean»
                          baseform.pas(254,15) Error: Incompatible types: got «Boolean» expected «LongInt»
                          baseform.pas(259,17) Error: Operator is not overloaded: «Boolean» * «ShortInt»
                          utils.pas(177,22) Error: Identifier not found «ParamStrUTF8»
                          utils.pas(308,6) Error: Identifier not found «FileExistsUTF8»
                          utils.pas(328,6) Error: Identifier not found «FileExistsUTF8»
                          utils.pas(333,74) Error: Identifier not found «SysErrorMessageUTF8»
                          restranslator.pas(156,6) Error: Identifier not found «FindFirstUTF8»
                          restranslator.pas(169,13) Error: Identifier not found «FindNextUTF8»
                          restranslator.pas(248,6) Error: Identifier not found «ExtractFileNameOnly»
                          restranslator.pas(246,3) Error: Identifier not found «LCLGetLanguageIDs»

                          Snipped piece of code from FileUtil:

                          {$IFDEF EnableWrapperFunctions}
                          // *** Wrappers for LazUTF8 ***
                          function ParamStrUTF8(Param: Integer): string; inline; deprecated 'Use the function in LazUTF8 unit';
                          function SysErrorMessageUTF8(ErrorCode: Integer): String; inline; deprecated 'Use the function in LazUTF8 unit';
                          [...]
                          // *** Wrappers for LazFileUtils ***
                          function ExtractFileNameOnly(const AFilename: string): string; inline; deprecated 'Use the function in LazFileUtils unit';
                          function FileExistsUTF8(const Filename: string): boolean; inline; deprecated 'Use the function in LazFileUtils unit';
                          function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint; inline; deprecated 'Use the function in LazFileUtils unit';
                          function FindNextUTF8(var Rslt: TSearchRec): Longint; inline; deprecated 'Use the function in LazFileUtils unit';
                          {$ENDIF EnableWrapperFunctions}
                          

                          And the little piece from LCLProc:

                          {$IFDEF EnableWrapperFunctions}
                            procedure LCLGetLanguageIDs(var Lang, FallbackLang: String); inline; deprecated 'Use function LazGetLanguageIDs in LazUTF8 unit';
                          {$ENDIF EnableWrapperFunctions}
                          

                          Понравилась статья? Поделить с друзьями:
                        • Error inaction number 1of create eventfor object objdevolver error defining an external function
                        • Error inaccessible boot device
                        • Error in writing the output log при загрузке что делать
                        • Error in wifi password text with at least 8 and maximum 64 symbols expected mikrotik
                        • Error in vbios image rx 5700