1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
function StrSum is new Sum(Unbounded_String, "&");
, и тогда эта же функция будет работать с неограниченной строкой, используя "&" как "+" (в смысле, подставляя вместо "сложения" склеивание строк)... Кто бы мне из фанатов С++ показал, как это реализовать там...
Среда ругается, когда видит в коде русские символы (даже если в комментариях), что делать? Поковырял исходники строк переменной длины. Заметил, что для удлинения строки буфер растёт по экспоненте (с базой 33/32), что хорошо. Не понял константу Standard'Maximum_Alignment (не нашёл описание). Не понравилось, что для оператора & нет проверки, что левый аргумент и результат указывают на один объект (ну чтобы с нуля строку не копировать), но тут, я так понял, в языке нет способа проверить это. Я не смог определить оператор ":=>[]" (ну захотелось красивый оператор завести), но это ладно, баловство. Ещё не получилось сделать так:
generic type KeyBase is (<>); -- любой дискретный тип ... -- где-то тут определяется aNode, не суть; ... type KeyArr is array (KeyBase) of aNode;
Пишет что тип не определён. А очень хотелось бы, что делать?
Ещё я не понял, чем отличается access от access all (если честно, я даже забыл, на какой странице это написано).
Чтоб среда не ругалась на кириллицу, я себе переключил в настройках IDE Character Set в "Unicode UTF-8". Ну, или с кодировкой отдельно взятых файлов поиграйся (правой кнопкой мыши в редакторе -> Properties)
Цитата
Я не смог определить оператор ":=>[]"
А тут вообще ничего нельзя определить. Можно только переопределить. Это большая разница.
Цитата
Не понял константу Standard'Maximum_Alignment (не нашёл описание).
Странно. У Гаввы на 387 странице есть описание:
Цитата
Standard’Maximum_Alignment где Standard — единственно возможный префикс. Предоставляет максимальное пригодное значение выравнивания для целевой платформы. Это статическое значение которое может быть использовано для указания требуемого выравнивания объектов. При этом во всех случаях будет гарантироваться правильность выравнивания объектов Это может быть полезно при импортировании внешних объектов, когда требования для их выравнивания не известны.
Цитата
Ещё не получилось сделать так:
Где именно ты пытаешься описывать KeyArr? Внутри пакета? Или снаружи? Или это у тебя вообще не пакет?
Цитата
Ещё я не понял, чем отличается access от access all
Тип access позволяет тебе ссылаться только на объекты, размещенные в динамической памяти. Обратиться к статической переменной ты через него не сможешь. То есть, смотри:
procedure Main is type Int_Ptr is access Integer; type Int_Ref is access all Integer;
AI : aliased Integer; -- косвенно доступная переменная. Статическая !!! P_Ptr : Int_Ptr; P_Ref : Int_Ref; begin -- попробуем получить ссылку на AI через Int_Ptr P_Ptr := AI'Access; -- Облом: access - только для дин. переменных
-- А теперь ссылку на AI через access all ? P_Ref := AI'Access; -- Все нормально, ошибки нет...
> Где именно ты пытаешься описывать KeyArr? Внутри пакета? Или снаружи? Или это у тебя вообще не пакет?
Да, это пакет. Да, внутри пакета.
При загрузке я выбрал "открыть существующий проект" и убрал галочку "показывать при каждом запуске", думая, что сохранится последний выбранный вариант. Вместо этого среда (при запуске) создаёт новый файл, диалог открытия показывает по умолчанию "мои документы" (директорию не запоминает), после долгого блуждания по папкам и открытия проекта при попытке компиляции выдаёт gnatmake -d -P C:\Documents\ and\ Settings\ТаÑаÑÐ\default.gpr (и не находит его там, понятное дело), хотя файл был открыт в другой папке. Откуда привязка к "моим документам"?
Добавлено через 7 мин. Так, про описание типа проехали, после подробного описания всего подряд компилятор таки съел массив с диапазоном неизвестного типа. Осталась проблема с папками по умолчанию.
Открой GPR-файл своего проекта (можешь просто текстовым редактором, можешь - правой кнопкой мыши по корневому узлу дерева, там Project -> Edit sources file), и посмотри, что указано в use у Object_Dir. Если там указано "C:\Documents and Settings ..." - то просто зайди в свойства проекта и поменяй на вкладке Objects путь к папке, в которой проект будет собираться...
Покорение отладчика пока не удалось. No symbol table is loaded. Use the "file" command.
Если при компиляции ошибка, то он не перекидывает сам на ошибку, приходится искать вкладку Locations, листать её вниз и среди всех сообщений искать те, что относятся к последней компиляции.
На мониторе 1024 на 600 меню занимает слишком много места (на код остаётся... треть высоты!). Окно с сообщениями тоже пестрит информацией, среди которой не найти нужную.
По поводу автотипов. Я так понял, слова Initialize, Adjust и Finalize зашиты в язык?
И почему-то ничего не выводит такой код:
-- auto.ads package Auto is
type Auto is private;
private
with ADA.Finalization; use ADA.Finalization;
type Auto is new Controlled with record null; end record;
procedure Initialize(a: in out Auto); procedure Finalize(a: in out Auto);
end package;
with ADA.Text_IO; use ADA.Text_IO; with ADA.Finalization; use ADA.Finalization;
-- auto.adb package body Auto is procedure Initialize(a: in out Auto) is begin Put_Line("initialization"); end;
procedure Finalize(a: in out Auto) is begin Put_Line("finalization"); end;
end package; -- test.adb with Auto; use Auto;
procedure Test is begin declare a: auto; begin null; end; end Test;
Покорение отладчика пока не удалось. No symbol table is loaded. Use the "file" command.
Странно. Посмотрел сейчас на новом проекте. Если в настройках на закладке Switches установки вот такие:
Gnatmake -> (галка установлена)"Debug Information" Ada -> (галка установлена)"Debug Information" Ada Linker -> (галка установлена)"Debug Information" и (галка снята)"Strip Symbols" , то дебаггер нормально запускается. В принципе, достаточно посмотреть в Messages, какая ком. строка выполняется при сборке программы. Если в вызове GCC присутствует ключ "-g", то сообщения "No symbol table is loaded" не будет.
Цитата
Если при компиляции ошибка, то он не перекидывает сам на ошибку
Это еще более странно. Не перебрасывать на Location и на первую из найденных ошибок в коде должно только в одном случае: у компилятора вообще нет претензий к программе. Но перед началом компиляции окно Locations должно очищаться. У тебя этого, по видимому, не происходит. А что вообще показывает окно Messages? Вот то, что я вижу у себя:
> Gnatmake -> (галка установлена)"Debug Information" Ada -> (галка установлена)"Debug Information" Ada Linker -> (галка установлена)"Debug Information" и (галка снята)"Strip Symbols"
Что-то много дублирующихся галочек. Мне бы вообще в идеале хотелось два положения - полная отладка и полная оптимизация.
(посмотрел, у меня третья галочка, оказывается, не стояла, а первые две стояли).
> Это еще более странно. Не перебрасывать на Location и на первую из найденных ошибок в коде должно только в одном случае: у компилятора вообще нет претензий к программе.
У меня это бывает только после попыток запустить отладчик.
> Более глобальный вопрос: путь к GNAT Studio в переменной PATH прописан? В каком состоянии галочка в Edit->Preferences->Jump to first Location?
Галочка есть.
> Вот такой код не только ничего выводить не должен, он даже не откомпилируется.
Я это потом понял.
> Вот чего выдало:
А как ты убрал жирную панель с картинками? С остальным я, вроде, разобрался, убрав в отдельные вкладки.
Да, теперь места для кода стало достаточно. Остался только вопрос - как же внутри реализован Controlled? Что у него за поля Prev и Next? И такие имена для процедур инициализации и финализации - это вшито в язык?
Остался только вопрос - как же внутри реализован Controlled? Что у него за поля Prev и Next?
Это поля для типа Simple_List_Controller, который используется при организации списка контролируемых объектов. Открой файл \GNAT\{версия}\lib\gcc\i686-pc-mingw32\4.3.4\adainclude\a-filico.ads, и посмотри на описание этого типа.
Цитата
такие имена для процедур инициализации и финализации - это вшито в язык?
О, я сумел запустить отладчик. Понравилось, что щелчок по адресу (в структуре с указателем) раскрывает его содержимое. Но нельзя ли показ переменных сделать попроще? А то нередко бывает список из 20 переменых. Размещать их мышкой по полю не лучший вариант.
Да, ещё окно дизассемблера не хочет показывать код, но мне пока страшно туда смотреть - я хоть и понимаю, что все конструкции могут развернуться и скомпилироваться без лишнего, но их высокоуровневость пугает.
> Это поля для типа Simple_List_Controller, который используется при организации списка контролируемых объектов.
То есть мне это не нужно пока, я так понял.
> Да, это вшито. А что, хочется другие имена?
Нет, просто чтоб знать. Мало ли там какой-то хитрый хак используется в описании типа, тогда интересно, как его реализовали.
Вот чего нет - того нет. По крайней мере в GPL-версии. В GPS Pro с этим чуть лучше (там побольше скриптов на отладчик навешано), но она стоит столько, что лучше пользуйся GPL версией. Тем более, что расположение окон сохраняется между сессиями отладки. В большинстве случаев мне дома хватает "показать локальные переменные" и одну-две более глобальных.
Цитата
окно дизассемблера не хочет показывать код
Нормально оно показывает код (в настройках среды можно даже указать, сколько строк кода показывать).
Теперь мне понадобилось обойти излишне жёсткий контроль за процедурными типами.
один модуль
generic type KeyBase is (<>); type Value is private;
package Dictionaries is
type Dictionary is private; type KeyArr is array (Positive range <>) of KeyBase; type ItemFunc is access procedure(K: KeyArr; V: Value);
...
procedure EnumNodes(D: Dictionary; P: ItemFunc); -- обойти словарь по алфавиту, для каждого узла применить P
основная программа
procedure Test is
package DCI is new Dictionaries(Character, Integer); use DCI;
procedure OutPair(S: string; i: integer) is begin null; end;
D: Dictionary; begin EnumNodes(D, OutPair'access); end Test;
очевидно, что тип String совпадает с типом KeyArr, и что тип Integer совпадает с типом Value. И я даже спокойно вызываю процедуры от KeyArr, передавая в них строковые константы (но неконстанты передавать не хочет почему-то).
Но тут выдало ошибку:
Ещё нету ли в языке для каждого типа предопределённой константы, состоящей из нулей?
Тут можно использовать анонимные процедурные типы в заголовке функции?!
> procedure OutPair(S: DCI.KeyArr; I: integer) is
Это проканало, только вместо Put(S) пришлось писать Put(String(S));
> Нет. А зачем?
Ну иногда в шаблоне надо инициализировать переменную неопределённого типа хоть чем-то. А FillChar типа не соответствует идеологии.
Ещё, по аналогии с Unbounded_String, нету ли в стандарте шаблонного Unbounded_Array для любого типа?
Также мне понадобились вещественные функции, умеющие работать с бесконечностями и не-числами без лишних проверок и исключений, я даже нашёл нужный модуль, но компилятор плюётся оранжевым и обещает страшные кары за его использование.
Ещё приходится извращаться с синонимами и сокращениями, чтобы не было совпадений в имени типа, имени пакета, имени переменной, константы перечислимого типа. Соглашения есть какие-нибудь, например, пакеты с буквы P, типы с буквы T (в Дельфи это удобно было), константы перечислимого типа - с заглавных букв названия типа, указатели на типа - с буквы A?
package pDemo is type tDemo is (dDemo, dRelease, dTest); type aDemo is access TDemo; Demo: tDemo;