Ada_Ru форум

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

default constraint

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

Сообщения

Dmitriy Anisimkov
default constraint
2003-12-22 09:02:19

Александр,

 

Пишу в форум тоже, потому что получал отлуп на адрес alex@....

 

Изучающий Аду Влад <vlad_Smaglyuk@...> нашел вот такую ошибку в твоей книге.

 

пункт.

 

5.3.3 Неограниченные записи (unconstrained records)

 

-------------------

type Property is array (Positive range <>) of Float;

type Man (Number: Positive := 2; Size: Positive := 10) is

record

Name : String (1..Size);

Prop_Array : Property (1..Number);

end record;

 

The_Man : Man;

^^^^^^^^^^^^^^

 

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

использует размер не из значений по умолчанию, а по максимуму.

 

GNAT компилятор настоятельно рекомендует так не делать.

 

gnatmake -g gad

gcc -c -g gad.adb

gad.adb:5:09: warning: creation of "Man" object may raise Storage_Error

gad.adb:10:04: warning: Storage_Error will be raised at run-time

gnatbind -x gad.ali

gnatlink gad.ali -g

 

Если задать констрейнт, то программа отработает без ошибок.

The_Man : Man (3, 4);

 

Но GNAT все равно немного предупреждает.

 

gnatmake -g gad

gcc -c -g gad.adb

gad.adb:5:09: warning: creation of "Man" object may raise Storage_Error

gnatbind -x gad.ali

gnatlink gad.ali -g

 

Я думаю не следуюет даже объявлять значения по умолчанию на типы данных с большими диапазонами.

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

Там вообще все очень интересно. Вот такой тестик:

 

with Ada.Text_IO; use Ada.Text_IO;

 

procedure Test_It is

subtype Ind is Positive range 1 .. 100;

-- subtype Ind is Positive range 1 .. 2147483647 - 6;

-- subtype Ind is Positive range 1 .. 2147483647 - 7;

 

type String1 is array (Ind range <>) of Character;

 

type Var_String (Len : Natural := 0) is record

Str : String1 (1 .. Len);

end record;

 

S : Var_String;

 

J : Positive := Positive'Last;

begin

Put_Line (J'Img);

end Test_It;

 

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

выполнить, в зависимости от того, какое объявление Ind раскомментировать.

 

У меня - последний GNAT5 в форточках, 2147483647 - это как раз

Positive'Last.

 

Надо бы с этим разобраться всерьез...

Dmitriy Anisimkov wrote:

Александр,

 

Пишу в форум тоже, потому что получал отлуп на адрес alex@....

 

Изучающий Аду Влад <vlad_Smaglyuk@...> нашел вот такую ошибку в твоей книге.

 

пункт.

 

5.3.3 Неограниченные записи (unconstrained records)

 

-------------------

type Property is array (Positive range <>) of Float;

type Man (Number: Positive := 2; Size: Positive := 10) is

record

Name : String (1..Size);

Prop_Array : Property (1..Number);

end record;

 

The_Man : Man;

^^^^^^^^^^^^^^

 

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

использует размер не из значений по умолчанию, а по максимуму.

 

GNAT компилятор настоятельно рекомендует так не делать.

 

Это похоже ошибка в компиляторе. Насколько я понимаю, если указываются дискриминанты по умолчанию, то язык требует фиксации длины объекта дискриминантного типа на максимальном значении, необходимом для представления любого из возможных объектов. И объяснение здесь примитивное: для подобных объектов разрешается присваивание, что может изменить дискриминант. А посему и Storage_Error _обязана_ возбуждаться при создании (4 гига памяти на ix86 - это круто! :).

 

 

-- Vadim Godunko

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

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