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


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

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

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


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

Правильно, мне это как раз даже нужно, мне этого реально не хватало в Дельфи.

> b := (d => 0, f1 => 1); -- Это - нет

А если я не знаю (на этапе компиляции), какое именно d мне понадобится?

case a.d is
when 0 => b := (b => 0, f1 => a.f1);
when 1 => b := (b => 1, f2 => a.f2);
when 2 => b := (b => 2, f2 => a.f2);
when 3 => b := (b => 3, f2 => a.f2);
when 4 => b := (b => 4, f2 => a.f2);
when 5 => b := (b => 5, f2 => a.f2);
when 6 => b := (b => 6, f2 => a.f2);
...
when others => raise Zachem_Tak_Mnogo_Ya_Ustal_Kopirovat;
end case;


Нет, спасибо.

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

t2.f2 и t2.f3 не должны вывестись вообще, но если заставить, то будет
Код

1
1 2
1

Во второй строке 1, а не 2, потому что его затёрло поле f1, находящееся по этому же адресу.
(я угадал? Программу не запускал)

Не вижу в этом примере ничего опасного. Программа должна срезаться при попытке вывести t2.f2 и t2.f3. А в присваивании нет ничего такого. t2.f1 будет честно равно единице.

> ты должен при помощи агрегата установить новый дискриминант и ВСЕ соответствующие ему поля.

А если я не знаю новое значение дискриминанта на этапе компиляции?

Добавлено через 3 мин.
Кстати, как сдвинуть выделенный текст вправо-влево (аналог ctrl+k+i, ctrl+k+u)?


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

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