![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
И что делать с этим 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 -------------------- |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата И что делать с этим Думать, прежде, чем писать такие вещи. Ибо компилятор на 100% прав. Смотри ,что происходит: до тех пор, пока ты пользуешься копированием вида t1 := t2 - компилятор не проверяет легальность такого копирования, он просто берет и копирует все содержимое одной записи в другую. А вот когда ты делаешь ссылками - тут все становится гораздо интереснее. Компилятор сначала проверит, а имеешь ли ты право это сделать, совпадает ли дискриминант. И только когда совпадает - все пройдет без выброса исключения. Смотри:raised CONSTRAINT_ERROR : test.adb:24 discriminant check failed function set(t: access tmain) return boolean is Цитата Кстати, смысла на ограничения параметров в функциях нет никакого. Правильно. Поэтому Стандарт Ada 2012 отменяет это ограничение. Как только он будет окончательно принят и будет создан компилятор, полностью поддерживающий новый Стандарт - можно будет пользоваться in out параметрами и в функциях.Цитата Дизассмеблер не взлетел: Couldn't get assembly code. У меня тоже так показывает. Ровно до того момента, как программа будет запущена. Запустил - получаю код в окошке Assembly. Я надеюсь в настройках проекта Switches -> Ada Linker не стоит галка на Strip symbols? Если стоит - то не будет ни Assembly, ни отображения регистров процессора. |
![]() ![]() |
![]() |
Текстовая версия | 25.06.2025 4:23 |