![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
TarasBer |
![]()
Сообщение
#21
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Хитрый, да?
Нет, просто со сложившимся мнением по другим (не будет показыать пальцем) языкам. > Только обходится очень просто: не надо ограничивать тип, просто задай функцию, которая будет использоваться при вычислении суммы. А, и эта функция будет находиться сама по имени, задавать её при инициализации шаблона не надо. Тогда жить можно. -------------------- |
volvo |
![]()
Сообщение
#22
|
Гость ![]() |
Я тебе больше скажу, можно даже сделать так:
function StrSum is new Sum(Unbounded_String, "&"); , и тогда эта же функция будет работать с неограниченной строкой, используя "&" как "+" (в смысле, подставляя вместо "сложения" склеивание строк)... Кто бы мне из фанатов С++ показал, как это реализовать там... |
TarasBer |
![]()
Сообщение
#23
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
То есть при инициализации шаблона можно не только использовать операции по умолчанию, но и вставлять свои?
В С++? Ну класс с нужной функцией в шаблон же пихать можно, вот например, так. -------------------- |
TarasBer |
![]()
Сообщение
#24
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Среда ругается, когда видит в коде русские символы (даже если в комментариях), что делать?
Поковырял исходники строк переменной длины. Заметил, что для удлинения строки буфер растёт по экспоненте (с базой 33/32), что хорошо. Не понял константу Standard'Maximum_Alignment (не нашёл описание). Не понравилось, что для оператора & нет проверки, что левый аргумент и результат указывают на один объект (ну чтобы с нуля строку не копировать), но тут, я так понял, в языке нет способа проверить это. Я не смог определить оператор ":=>[]" (ну захотелось красивый оператор завести), но это ладно, баловство. Ещё не получилось сделать так:
Пишет что тип не определён. А очень хотелось бы, что делать? Ещё я не понял, чем отличается access от access all (если честно, я даже забыл, на какой странице это написано). Сообщение отредактировано: TarasBer - 25.01.2011 20:37 -------------------- |
volvo |
![]()
Сообщение
#25
|
Гость ![]() |
Чтоб среда не ругалась на кириллицу, я себе переключил в настройках IDE Character Set в "Unicode UTF-8". Ну, или с кодировкой отдельно взятых файлов поиграйся (правой кнопкой мыши в редакторе -> Properties)
Цитата Я не смог определить оператор ":=>[]" А тут вообще ничего нельзя определить. Можно только переопределить. Это большая разница.Цитата Не понял константу Standard'Maximum_Alignment (не нашёл описание). Странно. У Гаввы на 387 странице есть описание:Цитата Standard’Maximum_Alignment где Standard — единственно возможный префикс. Предоставляет максимальное пригодное значение выравнивания для целевой платформы. Это статическое значение которое может быть использовано для указания требуемого выравнивания объектов. При этом во всех случаях будет гарантироваться правильность выравнивания объектов Это может быть полезно при импортировании внешних объектов, когда требования для их выравнивания не известны. Цитата Ещё не получилось сделать так: Где именно ты пытаешься описывать KeyArr? Внутри пакета? Или снаружи? Или это у тебя вообще не пакет?Цитата Ещё я не понял, чем отличается access от access all Тип access позволяет тебе ссылаться только на объекты, размещенные в динамической памяти. Обратиться к статической переменной ты через него не сможешь. То есть, смотри:procedure Main is |
TarasBer |
![]()
Сообщение
#26
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Где именно ты пытаешься описывать KeyArr? Внутри пакета? Или снаружи? Или это у тебя вообще не пакет?
Да, это пакет. Да, внутри пакета. При загрузке я выбрал "открыть существующий проект" и убрал галочку "показывать при каждом запуске", думая, что сохранится последний выбранный вариант. Вместо этого среда (при запуске) создаёт новый файл, диалог открытия показывает по умолчанию "мои документы" (директорию не запоминает), после долгого блуждания по папкам и открытия проекта при попытке компиляции выдаёт gnatmake -d -P C:\Documents\ and\ Settings\ТаÑаÑÐ\default.gpr (и не находит его там, понятное дело), хотя файл был открыт в другой папке. Откуда привязка к "моим документам"? Добавлено через 7 мин. Так, про описание типа проехали, после подробного описания всего подряд компилятор таки съел массив с диапазоном неизвестного типа. Осталась проблема с папками по умолчанию. -------------------- |
volvo |
![]()
Сообщение
#27
|
Гость ![]() |
Открой GPR-файл своего проекта (можешь просто текстовым редактором, можешь - правой кнопкой мыши по корневому узлу дерева, там Project -> Edit sources file), и посмотри, что указано в use у Object_Dir. Если там указано "C:\Documents and Settings ..." - то просто зайди в свойства проекта и поменяй на вкладке Objects путь к папке, в которой проект будет собираться...
|
Гость |
![]()
Сообщение
#28
|
Гость ![]() |
Покорение отладчика пока не удалось.
No symbol table is loaded. Use the "file" command. Если при компиляции ошибка, то он не перекидывает сам на ошибку, приходится искать вкладку Locations, листать её вниз и среди всех сообщений искать те, что относятся к последней компиляции. На мониторе 1024 на 600 меню занимает слишком много места (на код остаётся... треть высоты!). Окно с сообщениями тоже пестрит информацией, среди которой не найти нужную. По поводу автотипов. Я так понял, слова Initialize, Adjust и Finalize зашиты в язык? И почему-то ничего не выводит такой код:
|
-TarasBer- |
![]()
Сообщение
#29
|
Гость ![]() |
А, не, это опять что-то среда запускает только старый екзешник. То есть пытается.
[2011-01-26 11:44:22] Error while trying to execute C:\Program Files\ADA\projects\TEST\debug\test: not an executable А сообщение не высветилось. (для сравнения: так у меня настроена Д7, я и про размеры шрифта, полей, и про подсветку синтаксиса) ![]() |
TarasBer |
![]()
Сообщение
#30
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
И кстати, почему C:\Program Files\ADA\projects\TEST\debug\test
а не C:\Program Files\ADA\projects\TEST\test.exe ? А то я в этих вкладках совсем запутался, к тому же там многие галочки друг друга дублируют. Правка: перезапустил среду. Оказалось, что тот код не компилировался, но сообщения не выводились. Перекомпилил, наконец пошло. Сообщение отредактировано: TarasBer - 26.01.2011 12:01 -------------------- |
volvo |
![]()
Сообщение
#31
|
Гость ![]() |
Цитата Покорение отладчика пока не удалось. Странно. Посмотрел сейчас на новом проекте. Если в настройках на закладке Switches установки вот такие:No symbol table is loaded. Use the "file" command. Gnatmake -> (галка установлена)"Debug Information" Ada -> (галка установлена)"Debug Information" Ada Linker -> (галка установлена)"Debug Information" и (галка снята)"Strip Symbols" , то дебаггер нормально запускается. В принципе, достаточно посмотреть в Messages, какая ком. строка выполняется при сборке программы. Если в вызове GCC присутствует ключ "-g", то сообщения "No symbol table is loaded" не будет. Цитата Если при компиляции ошибка, то он не перекидывает сам на ошибку Это еще более странно. Не перебрасывать на Location и на первую из найденных ошибок в коде должно только в одном случае: у компилятора вообще нет претензий к программе. Но перед началом компиляции окно Locations должно очищаться. У тебя этого, по видимому, не происходит. А что вообще показывает окно Messages? Вот то, что я вижу у себя:gnatmake -d -PF:\\Programs\\Ada\\forum\\forum.gpr main.adb --subdirs=debug -cargs -g -O0 Более глобальный вопрос: путь к GNAT Studio в переменной PATH прописан? В каком состоянии галочка в Edit->Preferences->Jump to first Location? Цитата И почему-то ничего не выводит такой код: Вот такой код не только ничего выводить не должен, он даже не откомпилируется. Вот так будет работать:(auto.ads) with Ada.Finalization; use Ada.Finalization; (auto.adb) with Ada.Text_IO; use Ada.Text_IO; (main.adb) with auto; use auto; Вот чего выдало: ![]() (заодно, если что, размер окна - 1200*600. И что, меньше информации чем в Дельфи отображается?) |
TarasBer |
![]()
Сообщение
#32
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Gnatmake -> (галка установлена)"Debug Information"
Ada -> (галка установлена)"Debug Information" Ada Linker -> (галка установлена)"Debug Information" и (галка снята)"Strip Symbols" Что-то много дублирующихся галочек. Мне бы вообще в идеале хотелось два положения - полная отладка и полная оптимизация. (посмотрел, у меня третья галочка, оказывается, не стояла, а первые две стояли). > Это еще более странно. Не перебрасывать на Location и на первую из найденных ошибок в коде должно только в одном случае: у компилятора вообще нет претензий к программе. У меня это бывает только после попыток запустить отладчик. > Более глобальный вопрос: путь к GNAT Studio в переменной PATH прописан? В каком состоянии галочка в Edit->Preferences->Jump to first Location? Галочка есть. > Вот такой код не только ничего выводить не должен, он даже не откомпилируется. Я это потом понял. > Вот чего выдало: А как ты убрал жирную панель с картинками? С остальным я, вроде, разобрался, убрав в отдельные вкладки. Сообщение отредактировано: TarasBer - 26.01.2011 14:24 -------------------- |
volvo |
![]()
Сообщение
#33
|
Гость ![]() |
Панель с картинками - это ToolBar, там есть комбобокс "Toolbar style", перекинь его в Hide_Toolbar, панель исчезнет.
|
TarasBer |
![]()
Сообщение
#34
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
(как-то комбобоксы странно выглядят).
Да, теперь места для кода стало достаточно. Остался только вопрос - как же внутри реализован Controlled? Что у него за поля Prev и Next? И такие имена для процедур инициализации и финализации - это вшито в язык? -------------------- |
volvo |
![]()
Сообщение
#35
|
Гость ![]() |
Цитата Остался только вопрос - как же внутри реализован Controlled? Что у него за поля Prev и Next? Это поля для типа Simple_List_Controller, который используется при организации списка контролируемых объектов. Открой файл \GNAT\{версия}\lib\gcc\i686-pc-mingw32\4.3.4\adainclude\a-filico.ads, и посмотри на описание этого типа.Цитата такие имена для процедур инициализации и финализации - это вшито в язык? Да, это вшито. А что, хочется другие имена? |
TarasBer |
![]()
Сообщение
#36
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
О, я сумел запустить отладчик.
Понравилось, что щелчок по адресу (в структуре с указателем) раскрывает его содержимое. Но нельзя ли показ переменных сделать попроще? А то нередко бывает список из 20 переменых. Размещать их мышкой по полю не лучший вариант. Да, ещё окно дизассемблера не хочет показывать код, но мне пока страшно туда смотреть - я хоть и понимаю, что все конструкции могут развернуться и скомпилироваться без лишнего, но их высокоуровневость пугает. > Это поля для типа Simple_List_Controller, который используется при организации списка контролируемых объектов. То есть мне это не нужно пока, я так понял. > Да, это вшито. А что, хочется другие имена? Нет, просто чтоб знать. Мало ли там какой-то хитрый хак используется в описании типа, тогда интересно, как его реализовали. -------------------- |
volvo |
![]()
Сообщение
#37
|
Гость ![]() |
Цитата Но нельзя ли показ переменных сделать попроще? Вот чего нет - того нет. По крайней мере в GPL-версии. В GPS Pro с этим чуть лучше (там побольше скриптов на отладчик навешано), но она стоит столько, что лучше пользуйся GPL версией. Тем более, что расположение окон сохраняется между сессиями отладки. В большинстве случаев мне дома хватает "показать локальные переменные" и одну-две более глобальных.Цитата окно дизассемблера не хочет показывать код Нормально оно показывает код![]() (в настройках среды можно даже указать, сколько строк кода показывать). |
TarasBer |
![]()
Сообщение
#38
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Теперь мне понадобилось обойти излишне жёсткий контроль за процедурными типами.
один модуль
основная программа
очевидно, что тип String совпадает с типом KeyArr, и что тип Integer совпадает с типом Value. И я даже спокойно вызываю процедуры от KeyArr, передавая в них строковые константы (но неконстанты передавать не хочет почему-то). Но тут выдало ошибку: ![]() Ещё нету ли в языке для каждого типа предопределённой константы, состоящей из нулей? -------------------- |
volvo |
![]()
Сообщение
#39
|
Гость ![]() |
Ну, во-первых, Ада - это не Дельфи, для того чтоб описать переменную процедурного типа, передаваемую в другую процедуру, надо делать так:
procedure EnumNodes(D: Dictionary; А во-вторых, пользуйся типом KeyArr из пакета, ты ж его определил. procedure OutPair(S: DCI.KeyArr; I: integer) is Цитата Ещё нету ли в языке для каждого типа предопределённой константы, состоящей из нулей? Нет. А зачем? |
TarasBer |
![]()
Сообщение
#40
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> procedure EnumNodes(D: Dictionary;
P: access procedure(K: KeyArr; V: Value)); Тут можно использовать анонимные процедурные типы в заголовке функции?! > procedure OutPair(S: DCI.KeyArr; I: integer) is Это проканало, только вместо Put(S) пришлось писать Put(String(S)); > Нет. А зачем? Ну иногда в шаблоне надо инициализировать переменную неопределённого типа хоть чем-то. А FillChar типа не соответствует идеологии. Ещё, по аналогии с Unbounded_String, нету ли в стандарте шаблонного Unbounded_Array для любого типа? Также мне понадобились вещественные функции, умеющие работать с бесконечностями и не-числами без лишних проверок и исключений, я даже нашёл нужный модуль, но компилятор плюётся оранжевым и обещает страшные кары за его использование. Ещё приходится извращаться с синонимами и сокращениями, чтобы не было совпадений в имени типа, имени пакета, имени переменной, константы перечислимого типа. Соглашения есть какие-нибудь, например, пакеты с буквы P, типы с буквы T (в Дельфи это удобно было), константы перечислимого типа - с заглавных букв названия типа, указатели на типа - с буквы A?
-------------------- |
![]() ![]() |
![]() |
Текстовая версия | 13.08.2025 9:41 |