Глиф Учебники

Ошибка — несовместимые типы

Справочник · Pascal · 2 минуты чтения

Компилятор говорит, что значение справа от := (или в параметре) другого типа, чем переменная слева, и сам переводить его не будет. Чаще всего это дробное число, которое пытаются записать в целую переменную:

Pascal
var
  a, b, n: integer;
begin
  a := 7;
  b := 2;
  n := a / b;
end.

PascalABC.NET пишет «Нельзя преобразовать тип real к integer», Free Pascal — Error: Incompatible types: got "…" expected "…": после got — тип, который получился, после expected — тип, который нужен. Free Pascal называет integer по-своему — SmallInt, а результат / — Double или Extended, в зависимости от системы.

Как исправить: дробное → целое

Сначала решите, что нужно по смыслу:

НужноЗаписьДля 7 и 2
целая часть от деления целыхn := a div b3
остатокn := a mod b1
округлить дробноеn := round(a / b)4
отбросить дробную частьn := trunc(a / b)3
сохранить дробный результатописать n: real, тогда n := a / b3.5

Знак / в Pascal всегда даёт real, даже 6 / 2. Поэтому записать результат / в integer нельзя никогда — только через div, round или trunc. Обратное разрешено: целое число можно присвоить переменной real.

round(3.5) даёт 4, а round(2.5) — 2: числа ровно посередине округляются к чётному. Подробно о делении — в справке Чем отличаются div, mod и /.

Строка и число

Pascal
var
  n: integer;
  s: string;
begin
  s := '25';
  n := s;
end.

Строка '25' — это два символа, а не число 25, и сама в число не превратится. Переведите её процедурой val или функцией StrToInt, а число в строку — процедурой str или функцией IntToStr. Как именно — в справке Как перевести число в строку и обратно.

Символ и строка

char вмещает ровно один символ. c := 'ab' при c: char — ошибка: это строка из двух символов. Обратное допустимо: символ можно присвоить строке, s := c.

Символ-цифра — тоже не число: '7' и 7 — разные значения. Число из символа получают так: ord(c) - ord('0').

В параметрах подпрограмм

Та же ошибка бывает при вызове подпрограммы, если тип значения не подходит параметру. Особенно строго с var-параметрами: тип переменной должен совпадать с типом параметра точно. Процедуре procedure Swap(var a, b: integer) нельзя передать переменные типа real или byte.

Похожие ошибки