Ada_Ru форум

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

Почему не происходит Constraint_Error?

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

Сообщения

KsiCom
Почему не происходит Constraint_Error?
2008-03-28 15:45:47

Компилятор GNAT GPL 2007, ОС: CentOS 4.6

Вот такая программа:

 

procedure x is

type a is new Float range 0.0 .. 4.0;

b, c : a;

begin

b := 2.0;

c := 3.0;

-- Constraint_Error ?

if b > (c - 4.0) then

c := 1.0;

end if;

end x;

 

Если строку

if b > (c - 4.0) then

заменить на

if b > a (c - 4.0) then

то всё работает правильно и возникает Constraint_Error на этапе выполнения. На этапе компиляции никаких warningов нет.

 

Такое же наблюдается для целочисленных типов. -gnato не помогает.

Кто знает, в чём может быть дело?

KsiCom wrote:

Компилятор GNAT GPL 2007, ОС: CentOS 4.6

Вот такая программа:

 

procedure x is

type a is new Float range 0.0 .. 4.0;

b, c : a;

begin

b := 2.0;

c := 3.0;

-- Constraint_Error ?

if b > (c - 4.0) then

c := 1.0;

end if;

end x;

 

Если строку

if b > (c - 4.0) then

заменить на

if b > a (c - 4.0) then

то всё работает правильно и возникает Constraint_Error на этапе выполнения. На этапе компиляции никаких warningов нет.

 

Такое же наблюдается для целочисленных типов. -gnato не помогает.

 

Кто знает, в чём может быть дело?

 

Рассказываю: ключевой момент тут - когда и почему должно возникать

Constraint_Error. В случае a (c - 4.0) все просто - Constraint_Error

возникает в ходе вычисления значения преобразования типа, ибо оно

включает проверку ограничения, соответствующего целевому подтипу, то

есть - a.

 

А что мы имеем в случае

 

b > (c - 4.0)

 

а имеем мы всего лишь вызовы предопределенных операций типа а,

КОТОРЫЕ НИЧЕМУ НЕ ПРИСВАИВАЮТСЯ. А как определены эти

операции? А определены они не для а, а для a'Base

 

function "-" (L, R : a'Base) return a'Base;

function "<" (L, R : a'Base) return Boolean;

 

С ходу не нашел ссылку в стандарт, но это - известное недоразумение,

и именно так оно и разрешается.

 

То есть для всех вызовов операций параметры вполне попадают в определенный

для них диапазон.

С ходу не нашел ссылку в стандарт, но это - известное недоразумение,

и именно так оно и разрешается.

 

То есть для всех вызовов операций параметры вполне попадают в определенный

для них диапазон.

 

Все, вспомнил, как это доказать на основе стандарта. Двухходовая комбинация.

 

Объявление типа

 

type a is new Float range 0.0 .. 4.0;

 

объявляет новый плавающий тип (плевать, что через производный от

уже существующего) и его ПЕРВЫЙ ИМЕНОВАННЫЙ подтип. То есть

диапазон значений а - это диапазон значений не объявленного здесь

типа, а всего лишь его ПОДтипа а. А вот сам тип в данном случае

есть a'Base. Про это рассуждается во всех разделах главы 3, где

речь идет о числовых типах.

 

А в главе 4, когда речь идет об операциях, говорится, что

операции определены для ТИПА, а не для первого именованного

подтипа, отсюда и a'Base в (неявных) спецификациях предопределенных

операций.

 

Вот теперь - все.

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

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