Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2009, 01:24   #1
ray13
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию Ошибка переполнения и sqr.

Друзья, объясните почему здесь выскакивает ошибка переполнения. Ведь значение 640000 присваивается переменной x типа longint и входит в диапазон значений.

Код:
program p1;
{$Q+}
var r:integer;
     x:longint;
begin
     r:=800;
     x:=sqr(r);
     write(x)
end.
Например, в аналогичном случае всё работает без ошибок.

Код:
program p2;
{$Q+}
var i:integer;
     y:longint;
begin
     i:=255;
     y:=i+1;
     write(y)
end.
Объясните в чем тут логика? почему Паскаль в первом случае действует так, а во втором иначе?
ray13 вне форума Ответить с цитированием
Старый 27.02.2009, 01:31   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

ray13 В Free Pascal все работает.
В TP действительно говорит о переполнении.
Думаю, здесь дело в приведении типов, т.к. если переменную r сделать типа longint, ошибка исчезает.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 27.02.2009, 01:53   #3
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

объясняю: турбо паскаль считает так - он сначала выполняет выражение в правой части присваивания, а потом правую часть присваивает левой, то есть сначала есть переменная "r" - она возводится в квадрат функцией sqr - эта функция имеет такой же тип, как и тип переменной, поэтому, возводя в квадрат, вы получаете значение, находящееся за границей типа integer и получаете сообщение об ошибке

Код:
program p2;
{$Q+}
var i:integer;
     y:longint;
begin
     i:=255;
     y:=i+1;
     write(y)
end.
здесь случай не аналогичный - используете integer, а он поддерживает числа от -32768 до 32767 - как видно, у вас не используется никакая функция, поэтому данное присваивание совершенно нормальное и выводит нормальный результат - попробуйте использовать ту же функцию sqr на типе byte с тем же значением 255 - будет ошибка

Последний раз редактировалось capta1n; 27.02.2009 в 02:12.
capta1n вне форума Ответить с цитированием
Старый 27.02.2009, 02:06   #4
ray13
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию

спасибо! стало ясно.

но вот момент
Цитата:
Сообщение от capta1n Посмотреть сообщение
поэтому значение записывается не куда попало, а на место переменной "r", стирая старое значение
то есть в результате и r и x будут равны 640000 ?
но при write(r) выводиться старое значение 800.

2Sazary: можно поподробнее про приведение типов. в чем тут логика?

Последний раз редактировалось ray13; 27.02.2009 в 02:22.
ray13 вне форума Ответить с цитированием
Старый 27.02.2009, 02:13   #5
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

простите, я ошибся немного с объяснением, перечитайте снова.
capta1n вне форума Ответить с цитированием
Старый 27.02.2009, 02:24   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от ray13
можно поподробнее про приведение типов. в чем тут логика?
При вычислении выражения операнды приводятся к одному типу (старшему). Вот я и предположил, что происходит приведение, только к младшему типу. Пару раз были подобные ситуации, поэтому и сделал такой вывод.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 27.02.2009, 03:04   #7
ray13
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию

2capta1n: то есть sqr возвращает результат того же типа integer что и заданный аргумент r, а т.к. результат выходит за рамки Integerа - вылетает ошибка. то есть ошибка в выполнении самой функции и к операции присваивания она не имеет отношения. я правильно понял?

2Sazary: подобные ситуации - это глюк Турбо Паскаля?
ray13 вне форума Ответить с цитированием
Старый 27.02.2009, 08:46   #8
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

правильно поняли, да, а я первый раз наговорил чушь, простите
capta1n вне форума Ответить с цитированием
Старый 27.02.2009, 12:01   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от ray13
подобные ситуации - это глюк Турбо Паскаля?
Возможно. Как вы могли заметить, мы с capta1n говорим практически об одном и том же (приведении к младшему типу). Имхо, такого быть не должно, поэтому в данном случае это скорее особенности компилятора. Функция должна возвращать значение того же типа, что и переменная, которой это значение присваивается.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 01.03.2009, 21:53   #10
ray13
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию

спасибо за помощь! буду читать теорию)
кстати в тему особенностей компилятора, такой код срабатывает и выдает верный ответ

Код:
program p;
var i:byte;
     y:integer;
begin
     i:=20;
     y:=sqr(i);
     writeln(y);
end.

Последний раз редактировалось ray13; 01.03.2009 в 21:59.
ray13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
Функция проверки переполнения в Delphi TimeChip Общие вопросы Delphi 14 31.01.2009 17:04
Ошибка переполнения стека Cannibal Общие вопросы Delphi 1 01.12.2008 21:32
ошибка "Переполнения" Tanuska___:) БД в Delphi 0 08.10.2008 12:58
Ошибка переполнения стека из-за использования рекурсий Morrigan13 Помощь студентам 5 02.04.2008 08:04