![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
-TarasBer- |
![]()
Сообщение
#1
|
Гость ![]() |
Скачал я себе ГНАТ (Gnat GPL(без исходников, поленился все ссылки тыкать) и Win32Ada.
Скопировал я для начала в редактор кода текст из Википедии:
Нажимаю "проверка синтаксиса". [2011-01-18 21:32:02] Could not determine the project for file: C:\ADA\projects\Test\test.gpr В общем, я так понял, я пока с какими-то настройками не разобрался, что делать? Заметил, что можно копировать сообщения об ошибках в буфер обмена. Ещё, что функцию можно свернуть. После каждого сворачивания/разворачивания в конец добавляется пустая строчка (баг, есть таблетка?). В настройках цвета не нашёл отдельного цвета для символов. Мне нравится, когда скобочки и запятые коричневые, а не чёрные. |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Так вот, если внутри P кинуть исключение, то значение переменной PF.T, передаваемой внутрь процедуры, останется старым Во-первых, внутрь процедуры ничего не передается. out параметр - это ожидание, что процедура заполнит и передаст назад какое-то значение. Так что даже если ты инициализируешь чем-то PF.T перед тем, как вызвать процедуру, при выбросе исключения в PF.T все равно будет null. А во-вторых, такое поведение компилятора прописано в Стандарте языка:Цитата(Ada RM 6.4.1) After normal completion and leaving of a subprogram, for each in out or out parameter that is passed by copy, the value of the formal parameter is converted to the subtype of the variable given as the actual parameter and assigned to it. These conversions and assignments occur in an arbitrary order. Согласно пункту 6.2 ссылочный тип - это тип, передающийся "by copy", а выброс исключения не может считаться "нормальным завершением программы"Вывод: не передавать через out-параметры ссылочных (или любых других передающихся "by copy" типов), если подпрограмма может выбросить исключение. Как WorkAround (в твоем случае) - ловить в той же процедуре свое же исключение, освобождать память, и raise-ом отправлять дальше... P.S. Отделил от темы кусок, связанный с поиском утечек, в отдельную тему... |
![]() ![]() |
![]() |
Текстовая версия | 25.06.2025 1:06 |