Ошибка — несовместимые типы
Компилятор говорит, что значение справа от := (или в параметре) другого типа, чем переменная слева, и сам переводить его не будет. Чаще всего это дробное число, которое пытаются записать в целую переменную:
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 b | 3 |
| остаток | n := a mod b | 1 |
| округлить дробное | n := round(a / b) | 4 |
| отбросить дробную часть | n := trunc(a / b) | 3 |
| сохранить дробный результат | описать n: real, тогда n := a / b | 3.5 |
Знак / в Pascal всегда даёт real, даже 6 / 2. Поэтому записать результат / в integer нельзя никогда — только через div, round или trunc. Обратное разрешено: целое число можно присвоить переменной real.
round(3.5) даёт 4, а round(2.5) — 2: числа ровно посередине округляются к чётному. Подробно о делении — в справке Чем отличаются div, mod и /.
Строка и число
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.
Похожие ошибки
- Операция не применима к типам. Например,
x div 2приx: real—divиmodработают только с целыми числами. PascalABC.NET пишет сообщение вида «Операция 'div' не применима к типам real и integer», Free Pascal — что оператор для этих типов не определён (Operator is not overloaded). - Сравнения без скобок.
if a > 0 and b > 0— из-за порядка действийandприменяется к0 and b, и типы перестают сходиться. Пишитеif (a > 0) and (b > 0).