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 страниц V < 1 2  
 Ответить  Открыть новую тему 
Ответов(20 - 21)
сообщение
Сообщение #21


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

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

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


> Только у меня возникает вопрос: а почему надо обязательно вернуть эту новую функцию? Что, создать, и сразу выполнить с ней все что нужно - нельзя?

Зачем нужны лямбды?


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


Гость






Лямбды нужны там, где нет замыканий. В С++ их нет - они ввели Лямбды. В Паскале оно и так было. Нет, зачем-то пошли по пути "большого брата".

В данном случае - какая разница, вернешь ты функцию, или только создашь и выполнишь действие с ней? Все равно создавать функцию ты будешь НЕ в глобальной области видимости, а локально. Для всей программы - анонимно. Видима эта функция будет только из твоего вызывающего кода (New_Proc) и там, где код будет выполняться (test). Это что, очень отличается от лямбды?
 К началу страницы 
+ Ответить 

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

 





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