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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Дискриминантные записи - GNAT, (разделено)
сообщение
Сообщение #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 -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
Тогда они теряют смысл. Особенно, если value for discriminant must be static.
Я сказал на операцию присваивания, а не на операцию инициализации:

a := (d => 0, f1 => 1);
b := (d => 1, f2 => 2);

a := b; -- Это должно вызвать Constraint_Error
b := (d => 0, f1 => 1); -- Это - нет

Еще раз возвращаемся к тому, зачем были созданы записи с вариантами вообще и дискриминантные - в частности. Затем, чтобы контролировать, имеешь ли ты в данный конкретный момент (для установленного дискриминанта) обращаться к данному конкретному полю, или нет. А теперь см. сюда:

with ada.Text_IO;

procedure Main is

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

t1, t2, t3: aliased tmain;

begin
t1 := (d => 0, f1 => 1);
t2 := (d => 1, others => 2);
t3 := t1; -- Это - безопасное присваивание
t2 := t1; -- Это - "опасное" присваивание, разные дискриминанты
ada.Text_IO.Put_Line (integer'image(t1.f1));
ada.Text_IO.Put_Line (integer'image(t2.f2) & " " & integer'image(t2.f3));
ada.Text_IO.Put_Line (integer'image(t3.f1));
end main;

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

Вот как раз тогда, когда ты работаешь через access-параметры, контроль именно такой, каким должен быть.

Цитата
Но мне нужна и возможность на ходу изменять назначение.
Меняй. По правилам языка, а не по своим правилам, и не так, как ты привык это делать в других языках. По правилам Ады, чтобы сменить назначение записи (т.е., изменить значение дискриминанта), ты должен при помощи агрегата установить новый дискриминант и ВСЕ соответствующие ему поля. Только тогда ты сможешь избежать того, что я пытался показать тебе вышеприведенной программой.
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 9.05.2024 7:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name