IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Дискриминантные записи - GNAT, (разделено)
TarasBer
сообщение 31.01.2011 15:09
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +



procedure Test is

type test(d: integer := 0) is record
case d is
when 0 => f1: integer;
when others => f2: integer;
end case;
end record;

t1, t2, t3: aliased test;
b: boolean;

function set(t: access test) return boolean is
begin
t.all := t1; -- raised CONSTRAINT_ERROR : test.adb:24 discriminant check failed
return true;
end;

begin
t1 := (d=>0, f1=>0);
t2 := (d=>1, f2=>1);
t3 := (d=>1, f2=>1);
t2 := t1; -- тут всё нормально отрабатывает
b := set(t3'access);
end Test;



И что делать с этим
raised CONSTRAINT_ERROR : test.adb:24 discriminant check failed
?

В процедуре через out-параметр присвоилось нормально, однако.
А вот t3'access.all := t1'access.all; - ошибка дискриминанта

Почему прямо присваивать можно, а через указатель - нельзя? Так и написано в стандарте?

Если поставить точку останова, а потом добить пустых строчек так, чтобы эта точка оказалась на строчке, на которой ничего нет, а потом отрубить отладчик, пересобрать код, перезапустить отладчик, то эту точку останова уже не убрать.

Дизассмеблер не взлетел: Couldn't get assembly code.

Кстати, смысла на ограничения параметров в функциях нет никакого. Избавление от побочных эффектов? Ха, толку, если можно писать во внешние переменные. Зато костыль с access получится на славу по уродливости.
Зачем вообще языки Паскалевого семейства делают ненужное разделение на процедуры и функции? Да, концепция красивая, типа процедура - то, что выполняется, функция - то, что возвращает значение, но в условиях реальности она только мешает.

Сообщение отредактировано: TarasBer - 31.01.2011 15:11


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
TarasBer   Дискриминантные записи - GNAT   31.01.2011 15:09
volvo   Думать, прежде, чем писать такие вещи. Ибо компиля...   31.01.2011 17:24
TarasBer   > Компилятор сначала проверит, а имеешь ли ты п...   31.01.2011 18:11
volvo   Значит, тебе не нужна Ада. Используй С и действуй ...   31.01.2011 20:13
-TarasBer-   Мне всего-то надо создать в куче сущность с дискри...   31.01.2011 20:49
volvo   Я сказал на операцию присваивания, а не на операци...   1.02.2011 13:28
TarasBer   > Затем, чтобы контролировать, имеешь ли ты в д...   1.02.2011 14:15
volvo   Пожалуйста. Только тебе это не поможет - ты все ра...   2.02.2011 12:35
TarasBer   > Либо отказаться от использования discriminant...   2.02.2011 13:03
volvo   В Стандарте? Где именно, можно уточнить? Ибо это н...   2.02.2011 17:05
TarasBer   > В Стандарте? Где именно, можно уточнить? Ибо ...   3.02.2011 13:33
volvo   Оно уже сейчас есть в языке. Но только в А2005, а ...   3.02.2011 14:58
TarasBer   > С точки зрения компилятора эти 2 типа записи ...   3.02.2011 15:22
volvo   Я не про Модулу в данном случае. Я про тот проект,...   3.02.2011 17:52
-TarasBer-   > Я не про Модулу в данном случае. Я про тот пр...   3.02.2011 19:48
volvo   Не знаю, было ли у того проекта отдельное название...   3.02.2011 20:55
-TarasBer-   > Но Вирт продвигал там идеи Алгол-W Почитал в...   3.02.2011 21:19
volvo   Что именно ты пробовал сделать, можно посмотреть? ...   3.02.2011 21:38
TarasBer   Ну классический пример (из http://8vmr.livejournal...   4.02.2011 10:35
volvo   Стоп. Ада такого не позволит по одной простой прич...   4.02.2011 13:30
TarasBer   > Только у меня возникает вопрос: а почему надо...   4.02.2011 13:39
volvo   Лямбды нужны там, где нет замыканий. В С++ их нет ...   4.02.2011 14:15


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 25.06.2025 2:08
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"