IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V < 1 2 3  
 Ответить  Открыть новую тему 
> Настройка GPS (IDE для Ады), (разделено)
сообщение
Сообщение #41


Гость






Цитата
иногда в шаблоне надо инициализировать переменную неопределённого типа хоть чем-то.
Пишется функция, возвращающая определенное значение для определенного типа, и передается в пакет при инстанцировании.

Цитата
Тут можно использовать анонимные процедурные типы в заголовке функции?!
Более того, только подобное описание будет работать при любом раскладе. Если ты предварительно опишешь тип, а потом будешь его использовать в заголовке (дельфийская практика), то даже если это и заработает где-то в одном случае, всегда остается вероятность, что в других случаях это работать не будет. Конкретный пример приводил C. Okasaki, но найти его сейчас у меня не получилось...

Цитата
Ещё, по аналогии с Unbounded_String, нету ли в стандарте шаблонного Unbounded_Array для любого типа?
Вообще-то в стандарте и Ada.Containers.Ordered_Maps и Ada.Containers.Hashed_Maps есть, это ж тебя не останавливает от написания своего Dictionary?

Есть Ada.Containers.Vectors, аналог std::vector из STL: http://www.martin.dowie.btinternet.co.uk/C...rs-vectors.html

Цитата
Соглашения есть какие-нибудь
И соглашения есть. Вот такие, например:
http://www.adaic.org/resources/add_content.../sec_3/toc.html
 К началу страницы 
+ Ответить 
сообщение
Сообщение #42


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

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

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


> Если ты предварительно опишешь тип, а потом будешь его использовать в заголовке (дельфийская практика), то даже если это и заработает где-то в одном случае, всегда остается вероятность, что в других случаях это работать не будет.

Тогда зачем вообще может понадобиться описывать такой тип?
Так, вспомнил.
При описании оконного класса (в задании оконной функции) проблем тут не будет?

> Вообще-то в стандарте и Ada.Containers.Ordered_Maps и Ada.Containers.Hashed_Maps есть, это ж тебя не останавливает от написания своего Dictionary?

Словарь я пишу свой, потому что:
1. Велосипеды полезны для общего развития и особенно для изучения языка.
2. Я пишу именно префиксное дерево (а не красно-чёрное дерево (Ordered_Maps) и не хеш-список (Hashed_Maps)) даже не для хранения данных по ключу (хотя у него очень высокая алгоритмическая эффективность), а для выделения самого длинного слова словаря, являющегося началом данной строки (или продолжением строки с определённой позиции).
То есть это именно словарь, а не карта.

В Дельфи меня парило, что этот словарь надо самому удалять, у меня даже были мысли делать его динмассивом, а вместо ссылок использловать номера потомков в массиве. Народ ещё рассказывал про хитрые приведения к интерфейсам (для автоудаления), я, правда, не знаю, насколько это обезопасит от мёртвых ссылок.
Ну и ещё (в Д7) я для универсальности (шаблонов-то нету) брал словарь строк из строк, а другие типы побайтово отображал в строку.

> Есть Ada.Containers.Vectors, аналог std::vector из STL: http://www.martin.dowie.btinternet.co.uk/C...rs-vectors.html

Спасибо.

Сообщение отредактировано: TarasBer -


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


Гость






Цитата
При описании оконного класса (в задании оконной функции) проблем тут не будет?
Нет, не будет. Вот это, кстати, тот случай, когда описание отдельного типа необходимо: смена соглашения о вызове. Для отдельно описанного типа Func_Type это делается
pragma Convention (Stdcall, Func_Type);

если имени типа нет, тогда как?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #44


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

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

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


Ещё вопрос - есть ли тут аналог паскалевского with?


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


Гость






Нет, он здесь на фиг не нужен. При наличии возможности сделать
declare
R : SomeType renames Very_Long_Path_To_Rec;
begin
R.field1 := value;
-- ...
end;

паскалевский With теряет преимущества.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #46


Гость






Посмотрел я Container.Vector.
Не нашёл двух функций (самых главных, наверное).
Array_To_Vector
и
Vector_To_Array
Поэлементно собирать неудобно.
И в доступе к элементу много проверок. Компилятор умеет ветки, состоящие только из выброса исключения, распознавать как проверки и выкидывать в неотладочной версии?

Разделено: Дискриминантные записи - GNAT + Отлов утечек памяти - GNAT
 К началу страницы 
+ Ответить 
сообщение
Сообщение #47


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

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

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


Новая проблема.
Я обнаружил утечку памяти у себя. Стал искать.
Нашёл.

Суть такая.
Есть процедура P(T: out aInteger);
Где-то внутри неё происходит T := new integer;
И где-то дальше (внутри неё) какая-то проверка на корректность выражения и выброс исключения.
Внешний код примерно такой:

PF.T := null;
P(PF.T);
что-то сделать с PF.T

И в деструкторе объекта PF прописано что-то типа if T /= null then Free(T);

Так вот, если внутри P кинуть исключение, то значение переменной PF.T, передаваемой внутрь процедуры, останется старым (как будто её не трогали)! И к объекту, созданному внутри, нет доступа и он повиснет в памяти - утечка.
То есть сопоставления внутренного out-параметра и внешней переменной как бы и нету, оно неявно копируется при корректном выходе из процедуры, а при некорректном внутренний объект висит.
Что делать?


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


Гость






Цитата
Так вот, если внутри 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. Отделил от темы кусок, связанный с поиском утечек, в отдельную тему...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #49


Гость






Ну допустим, в моём случае, я разберусь как-то, что в случае исключения надо освободить память, как-то разберусь в этой вложенной рекурсивной структуре, где что надо освобождать в случае утечки. Но если мне дейтвительно снаружи нужно значение указателя (или целого) даже если выкинулось исключение? Есть ли оператор, который позволил бы прямо записать в наружные параметры результат? Аналогичный вопрос про return (и все языки, где он есть) - как одновременно выкинуть исключение и вернуть значение?

А вообще мысль с копированием переменной в стек хорошая - меньше неявных разыменований указателя, оптимизация...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #50


Гость






По-моему, у кого-то неправильное понимание сущности исключений...

Цитата
Ada Model of Exceptions

<...>
To raise an exception is to abandon normal program execution thus drawing attention to the fact that the corresponding situation has arisen.

<...>
When an exception occurrence is raised by the execution of a given construct, the rest of the execution of that construct is abandoned; that is, any portions of the execution that have not yet taken place are not performed.
Поскольку возврат функцией результата - это завершающее действие (равно как и возврат out-параметров), и если ты хочешь исключение, ты должен его выбросить раньше, то ни функция ни процедура не завершат работу нормально, это будет исключительная ситуация, и текущая конструкция не выполнится. То есть, в Аде это технически невозможно. Не пользуются исключениями одновременно с возвратом значения. Либо одно, либо другое.

Максимум, что можно предложить - это в случае исключения забрасывать результат в глобальную переменную... Но это неверный дизайн.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #51


Гость






Да я вообще исключениями впервые в жизни решил воспользоваться. Обычно всё на кодах возврата пишу, а исключениями просто обматываю некоторые куски после жалоб пользователей, чтобы если упадёт, то пользователю вывелось что-нибудь посодержательнее, чем "облом по адресу 87654321, обращение к 12345678".
 К началу страницы 
+ Ответить 
сообщение
Сообщение #52


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

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

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


У меня почему-то стало пропадать окно с переменными. То есть если его открыть, потом отрубить отладчик, а потом снова запустить отладчик, то окна переменных не будет видно, чтобы оно появилось, надо все окна утащить в сторону (как плавающие).
В режиме отладки вместо строк, передаваемых в процедуры, видны какие-то адреса, при попытке узнать, что по ним, показывает "неизвестная переменная". Вычисление функций в режиме отладки не работает.
Пока пытаюсь понять, почему моя программа показывает окно только в неотладочном режиме, а в отладочном не хочет регистрировать оконных класс.

Добавлено через 13 мин.
Переменная для extended return не видна в отладчике.


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


Гость






Странно...

Вот тут я записал небольшое видео, прекрасно показывается окно переменных при инициализации/финализации дебаггера... И окно создается в режиме Debug. И строку показывает...

Цитата
Переменная для extended return не видна в отладчике.
И это неправда. Поменял процедуру на функцию, и вот:
Прикрепленное изображение

Может, все дело - в том, что у тебя Gnat GPL 2010, а у меня - GPL 2009? Все-таки, в 2010 они вводили какие-то фичи из стандарта 2012, может, поломали чего?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #54


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

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

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


> Вот тут я записал небольшое видео

Дома посмотрю.

> И окно создается в режиме Debug.

Для того, чтобы преобразовать строку в PCCH при создании оконного класса, я применял функцию, создававшую временный контролируемый объект, который внутри хранил выделенную в куче строку S&0, а также поле с указателем на эту строку. В финализаторе объекта эта строка удалялась.
Если написать что-то типа

C := PCHAR(S).ref;
DoWinAPIFunc©;

То временный объект финализируется не при выходе из подпрограммы, а сразу после присваивания C := PCHAR(S).ref;

Вот и глючило. Мда, нюансов-то сколько.

> Может, все дело - в том, что у тебя Gnat GPL 2010, а у меня - GPL 2009?

Прикрепленное изображение

Да, с окном переменных я понял, оно появляется, но иногда имеет 0ю толщину, его надо вытянуть.


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


Гость






Ну, я и говорю:


Эскизы прикрепленных изображений
Прикрепленное изображение
 К началу страницы 
+ Ответить 
сообщение
Сообщение #56


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

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

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


Ещё проблема.
Прикрепленное изображение
Большую часть времени написания код я не код пишу, а проблемы такие пытаюсь разгребать.
Очень тяжело, просто ужас как тяжело.
Если бы ботланд не додумался до идиотской идеи не вводить автодеструкторы в ООП, я бы давно забил на ГНАТ.


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


Гость






Прикрепленное изображение
Что я не так делаю?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #58


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

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

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


> Что я не так делаю?

Используешь старую версию?
А в 2009 точно всё в порядке? Может, откатиться попробовать.


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


Гость






Не знаю, мне не с чем сравнивать. Я 2010 под Windows не видел никогда. 2009 - совершенно нормальная версия. Пока не примут А2012, и не поправят под него компилятор - дома обновляться не собираюсь.
 К началу страницы 
+ Ответить 

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

 





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