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


Гость






Цитата
А если я не знаю (на этапе компиляции), какое именно d мне понадобится?
<...>
Нет, спасибо.
Пожалуйста. Только тебе это не поможет - ты все равно получишь Constraint_Error. Выбор у тебя невелик. Либо отказаться от использования discriminant records и решить задачу по-другому, либо воспользоваться procedure вместо function (это тоже не будет работать со всеми вариантами, см. ниже), либо отключать проверку дискриминанта. Ну, и четвертый вариант: ждать выхода компилятора, полностью поддерживающего Ada 2012.

Ада тебе не позволит никакими ухищрениями обойти контроль дискриминанта в любом объекте, расположенном в куче, либо вообще в любом объекте, если ты обращаешься к нему через ссылку. Обрати внимание:
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;

procedure copy(to : in out tmain; from : tmain) is
begin
to := from;
end copy;

t1: aliased Tmain;
t2: aliased Tmain;
t3: access TMain;
begin
t1 := (d => 0, f1 => 1);
t2 := (d => 1, others => 2);
t3 := new TMain'(D => 1, others => 5);

copy(t2, t1); -- Это отработает без проблем
copy(t1, t3.all); -- Это работать не будет - ссылка, контроль будет усилен
end Main;

Контроль можно только отключить. Хочешь - отключай (если уверен, что это не приведет в дальнейшем к проблемам).

Цитата
Кстати, как сдвинуть выделенный текст вправо-влево (аналог ctrl+k+i, ctrl+k+u)?
Без понятия. Не требовалось ни разу, у меня на сохранение файла повешено его переформатирование, каждый раз когда я жму Ctrl+S, исходник приводится к тому виду, который я установил в "Pretty Printer" в настройках проекта. Потом при проверке стиля проблем гораздо меньше.

Можно сделать такое форматирование вручную, Edit -> Pretty Print.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
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 5:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name