Ada_Ru форум

Обсуждение языка Ада

В начале....

Оставить новое сообщение

Сообщения

Guest007
В начале....
2005-11-26 06:06:59

Приветствую!

 

В "Уроках" (http://www.ada-ru.org/Lovelace/s1sf.htm) написано:

 

"Ada демонстрирует лучший подход: когда операция (такая, как умножение на 2) невыполнима, Ada вызывает "исключение". Таким образом, рано или поздно, эта программа будет прервана с сообщением, указывающим, почему и где произошло ее завершение."

 

Но приведённый в примере текст выдаёт:

1

2

4

[skip]

268435456

536870912

1073741824

-2147483648

0

0

0

0

0

0

И дальше нули до Ctrl-C

 

Я привык в Питоне видеть другой результат обработки исключительной ситуации :-)

 

Это где-то ошибка, или я недочитал?

 

Алексей

 

 

 

--

WBR Guest007

JID: guest007@...

Guest007 wrote:

 

Это где-то ошибка, или я недочитал?

 

GNAT по умолчанию не производит контроля целочисленного переполнения. Компилировать программу надо с -gnato.

 

 

-- Vadim Godunko

 

Technoserv A/S

Rostov-on-Don, Russia

В сообщении от Среда 26 Октябрь 2005 10:38 Vadim Godunko написал(a):

Guest007 wrote:

Это где-то ошибка, или я недочитал?

 

GNAT по умолчанию не производит контроля целочисленного переполнения. Компилировать программу надо с -gnato.

Спасибо

 

 

--

WBR Guest007

JID: guest007@...

Vadim Godunko wrote:

 

>Это где-то ошибка, или я недочитал?

 

GNAT по умолчанию не производит контроля целочисленного переполнения. Компилировать программу надо с -gnato.

 

Очень странное поведение, по-моему. Почему бы не заставить

программиста сделать осознанный выбор и явно отключить эту

проверку с помощью прагмы в исходниках ? Все проверки должны

быть по умолчанию включены, отключаться должны только прагмами

в исходниках. Или я опять неправильно читал стандарт ?

 

А то, панимаш, только новообращённый решил примкнуть к рядам,

как уже на примерах из учебника получил errorneous execution.

Как вы думаете, поможет ли этот случай преумножению

Ada-community или нет ?

Wladimir Mutel wrote:

 

> проверку с помощью прагмы в исходниках ? Все проверки должны

> быть по умолчанию включены, отключаться должны только прагмами

> в исходниках. Или я опять неправильно читал стандарт ?

 

 

Я тоже был удивлен, когда обнаружил что по умолчанию целочисленное переполнение не отслеживается.

Vadim Godunko wrote:

 

> Очень странное поведение, по-моему. Почему бы не заставить

> программиста сделать осознанный выбор и явно отключить эту

> проверку с помощью прагмы в исходниках ? Все проверки должны

> быть по умолчанию включены, отключаться должны только прагмами

> в исходниках. Или я опять неправильно читал стандарт ?

 

 

 

3.5.4 Integer Types

 

 

.............

24

For the execution of a predefined operation of a signed integer type, the implementation need not raise Constraint_Error if the result is outside the base range of the type, so long as the correct result is produced.

 

Согласно стандарта получается что проверяются по умолчанию только диапазон, заданный явно, превышение base range не проверяется по умолчанию.

Очень странное поведение, по-моему. Почему бы не заставить

 

> программиста сделать осознанный выбор и явно отключить эту

> проверку с помощью прагмы в исходниках ? Все проверки должны

> быть по умолчанию включены, отключаться должны только прагмами

> в исходниках. Или я опять неправильно читал стандарт ?

 

 

 

3.5.4 Integer Types

 

 

.............

24

For the execution of a predefined operation of a signed integer type, the implementation need not raise Constraint_Error if the result is outside the base range of the type, so long as the correct result is produced.

 

Согласно стандарта получается что проверяются по умолчанию только диапазон, заданный явно, превышение base range не проверяется по умолчанию.

On Wed, Oct 26, 2005 at 02:56:36PM +0700, Dmitriy Anisimkov wrote:

For the execution of a predefined operation of a signed integer

type, the implementation need not raise Constraint_Error if the result is outside the base range of the type, so long as the correct result is produced.

 

Согласно стандарта получается что проверяются по умолчанию только диапазон, заданный явно, превышение base range не проверяется по умолчанию.

 

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

X := 2;

Y := Integer'Last;

Y := Y * X / 4;

Может не возбуждать переполнение, если посчитает Y правильно.

--

Maxim Reznik

Maxim Reznik wrote:

 

>On Wed, Oct 26, 2005 at 02:56:36PM +0700, Dmitriy Anisimkov wrote:

 

For the execution of a predefined operation of a signed integer

>type, the implementation need not raise Constraint_Error if the result >is outside the base range of the type, so long as the correct result is >produced.

 

>Согласно стандарта получается что проверяются по умолчанию только >диапазон, заданный явно, превышение base range не проверяется по умолчанию.

 

 

 

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

>X := 2;

>Y := Integer'Last;

>Y := Y * X / 4;

>Может не возбуждать переполнение, если посчитает Y правильно.

 

 

Вообще то говориться не про промежуточный результат, а про конечный

For the execution of a predefined operation of a signed integer type, the implementation need not raise Constraint_Error if the result is outside the base range of the type, so long as the correct result is produced.

 

тут я думаю говорится про случай, когда short встроенные целые первышают свой размер после операции,

но потом можно его преобразовать во встроенное целое в 2 раза длиннее, например.

 

S1 : Short_Integer := 30000;

S2 : Short_Integer := 30000;

I1 : Integer := Integer (S1 * S2);

 

Наверное в этом случае не надо исключения.

Но если попытаться

 

S3 : Short_Integer := S1 * S2;

 

То результат будет не корректным, и должно быть исключение.

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти