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

> Внимание!

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

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

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


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

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

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


> Хитрый, да?

Нет, просто со сложившимся мнением по другим (не будет показыать пальцем) языкам.

> Только обходится очень просто: не надо ограничивать тип, просто задай функцию, которая будет использоваться при вычислении суммы.

А, и эта функция будет находиться сама по имени, задавать её при инициализации шаблона не надо.
Тогда жить можно.


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


Гость






Я тебе больше скажу, можно даже сделать так:

  function StrSum is new Sum(Unbounded_String, "&");

, и тогда эта же функция будет работать с неограниченной строкой, используя "&" как "+" (в смысле, подставляя вместо "сложения" склеивание строк)... Кто бы мне из фанатов С++ показал, как это реализовать там...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


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

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

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


То есть при инициализации шаблона можно не только использовать операции по умолчанию, но и вставлять свои?

В С++? Ну класс с нужной функцией в шаблон же пихать можно, вот например, так.


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


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

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

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


Среда ругается, когда видит в коде русские символы (даже если в комментариях), что делать?
Поковырял исходники строк переменной длины.
Заметил, что для удлинения строки буфер растёт по экспоненте (с базой 33/32), что хорошо. Не понял константу Standard'Maximum_Alignment (не нашёл описание).
Не понравилось, что для оператора & нет проверки, что левый аргумент и результат указывают на один объект (ну чтобы с нуля строку не копировать), но тут, я так понял, в языке нет способа проверить это.
Я не смог определить оператор ":=>[]" (ну захотелось красивый оператор завести), но это ладно, баловство.
Ещё не получилось сделать так:

generic
type KeyBase is (<>); -- любой дискретный тип
...
-- где-то тут определяется aNode, не суть;
...
type KeyArr is array (KeyBase) of aNode;


Пишет что тип не определён.
А очень хотелось бы, что делать?

Ещё я не понял, чем отличается access от access all (если честно, я даже забыл, на какой странице это написано).

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


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


Гость






Чтоб среда не ругалась на кириллицу, я себе переключил в настройках 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;
-- Все нормально, ошибки нет...

-- ...
end Main;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


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

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

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


> Где именно ты пытаешься описывать KeyArr? Внутри пакета? Или снаружи? Или это у тебя вообще не пакет?

Да, это пакет.
Да, внутри пакета.

При загрузке я выбрал "открыть существующий проект" и убрал галочку "показывать при каждом запуске", думая, что сохранится последний выбранный вариант. Вместо этого среда (при запуске) создаёт новый файл, диалог открытия показывает по умолчанию "мои документы" (директорию не запоминает), после долгого блуждания по папкам и открытия проекта при попытке компиляции выдаёт gnatmake -d -P C:\Documents\ and\ Settings\ТарасБ\default.gpr (и не находит его там, понятное дело), хотя файл был открыт в другой папке. Откуда привязка к "моим документам"?

Добавлено через 7 мин.
Так, про описание типа проехали, после подробного описания всего подряд компилятор таки съел массив с диапазоном неизвестного типа.
Осталась проблема с папками по умолчанию.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 зашиты в язык?

И почему-то ничего не выводит такой код:


-- 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;


 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Гость






А, не, это опять что-то среда запускает только старый екзешник. То есть пытается.

[2011-01-26 11:44:22] Error while trying to execute C:\Program Files\ADA\projects\TEST\debug\test: not an executable

А сообщение не высветилось.

(для сравнения: так у меня настроена Д7, я и про размеры шрифта, полей, и про подсветку синтаксиса)

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


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

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

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


И кстати, почему C:\Program Files\ADA\projects\TEST\debug\test
а не C:\Program Files\ADA\projects\TEST\test.exe
?

А то я в этих вкладках совсем запутался, к тому же там многие галочки друг друга дублируют.

Правка: перезапустил среду. Оказалось, что тот код не компилировался, но сообщения не выводились. Перекомпилил, наконец пошло.

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


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


Гость






Цитата
Покорение отладчика пока не удалось.
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 -d -PF:\\Programs\\Ada\\forum\\forum.gpr main.adb --subdirs=debug -cargs -g -O0
gcc -c -g -gnatVn -gnat05 -gnata -g -g -O0 -I- -gnatA F:\Programs\Ada\forum\main.adb
main.adb:177:04: warning: variable "P_Ptr" is never read and never assigned
gcc -c -g -gnatVn -gnat05 -gnata -g -g -O0 -I- -gnatA F:\Programs\Ada\forum\myobj.adb
gcc -c -g -gnatVn -gnat05 -gnata -g -g -O0 -I- -gnatA F:\Programs\Ada\forum\mypck.ads
gnatbind -shared -I- -x F:\Programs\Ada\forum\debug\main.ali
gnatlink F:\Programs\Ada\forum\debug\main.ali -shared-libgcc -g -g -o F:\Programs\Ada\forum\debug\main.exe

[2011-01-26 12:04:32] process terminated successfully (elapsed time: 00.98s)

Более глобальный вопрос: путь к GNAT Studio в переменной PATH прописан? В каком состоянии галочка в Edit->Preferences->Jump to first Location?

Цитата
И почему-то ничего не выводит такой код:
Вот такой код не только ничего выводить не должен, он даже не откомпилируется. Вот так будет работать:
(auto.ads)
with Ada.Finalization; use Ada.Finalization;

package Auto is

type Auto is private;

private
type Auto is new Controlled with record
null;
end record;

procedure Initialize(a: in out Auto);
procedure Finalize(a: in out Auto);

end Auto;


(auto.adb)
with Ada.Text_IO; use Ada.Text_IO;

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 Auto;


(main.adb)
with auto; use auto;

procedure Main is
begin
declare
A : Auto.Auto;
begin
null;
end;
end main;



Вот чего выдало:
Прикрепленное изображение
(заодно, если что, размер окна - 1200*600. И что, меньше информации чем в Дельфи отображается?)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


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

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

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


> Gnatmake -> (галка установлена)"Debug Information"
Ada -> (галка установлена)"Debug Information"
Ada Linker -> (галка установлена)"Debug Information" и (галка снята)"Strip Symbols"

Что-то много дублирующихся галочек.
Мне бы вообще в идеале хотелось два положения - полная отладка и полная оптимизация.

(посмотрел, у меня третья галочка, оказывается, не стояла, а первые две стояли).

> Это еще более странно. Не перебрасывать на Location и на первую из найденных ошибок в коде должно только в одном случае: у компилятора вообще нет претензий к программе.

У меня это бывает только после попыток запустить отладчик.

> Более глобальный вопрос: путь к GNAT Studio в переменной PATH прописан? В каком состоянии галочка в Edit->Preferences->Jump to first Location?

Галочка есть.

> Вот такой код не только ничего выводить не должен, он даже не откомпилируется.

Я это потом понял.

> Вот чего выдало:

А как ты убрал жирную панель с картинками? С остальным я, вроде, разобрался, убрав в отдельные вкладки.

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


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


Гость






Панель с картинками - это ToolBar, там есть комбобокс "Toolbar style", перекинь его в Hide_Toolbar, панель исчезнет.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


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

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

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


(как-то комбобоксы странно выглядят).

Да, теперь места для кода стало достаточно.
Остался только вопрос - как же внутри реализован Controlled? Что у него за поля Prev и Next? И такие имена для процедур инициализации и финализации - это вшито в язык?


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


Гость






Цитата
Остался только вопрос - как же внутри реализован Controlled? Что у него за поля Prev и Next?
Это поля для типа Simple_List_Controller, который используется при организации списка контролируемых объектов. Открой файл \GNAT\{версия}\lib\gcc\i686-pc-mingw32\4.3.4\adainclude\a-filico.ads, и посмотри на описание этого типа.

Цитата
такие имена для процедур инициализации и финализации - это вшито в язык?
Да, это вшито. А что, хочется другие имена?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


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

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

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


О, я сумел запустить отладчик.
Понравилось, что щелчок по адресу (в структуре с указателем) раскрывает его содержимое.
Но нельзя ли показ переменных сделать попроще?
А то нередко бывает список из 20 переменых.
Размещать их мышкой по полю не лучший вариант.

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

> Это поля для типа Simple_List_Controller, который используется при организации списка контролируемых объектов.

То есть мне это не нужно пока, я так понял.

> Да, это вшито. А что, хочется другие имена?

Нет, просто чтоб знать. Мало ли там какой-то хитрый хак используется в описании типа, тогда интересно, как его реализовали.


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


Гость






Цитата
Но нельзя ли показ переменных сделать попроще?
Вот чего нет - того нет. По крайней мере в GPL-версии. В GPS Pro с этим чуть лучше (там побольше скриптов на отладчик навешано), но она стоит столько, что лучше пользуйся GPL версией. Тем более, что расположение окон сохраняется между сессиями отладки. В большинстве случаев мне дома хватает "показать локальные переменные" и одну-две более глобальных.

Цитата
окно дизассемблера не хочет показывать код
Нормально оно показывает код
Прикрепленное изображение
(в настройках среды можно даже указать, сколько строк кода показывать).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


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

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

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


Теперь мне понадобилось обойти излишне жёсткий контроль за процедурными типами.

один модуль

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, передавая в них строковые константы (но неконстанты передавать не хочет почему-то).

Но тут выдало ошибку:

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

Ещё нету ли в языке для каждого типа предопределённой константы, состоящей из нулей?


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


Гость






Ну, во-первых, Ада - это не Дельфи, для того чтоб описать переменную процедурного типа, передаваемую в другую процедуру, надо делать так:

   procedure EnumNodes(D: Dictionary;
P: access procedure(K: KeyArr; V: Value));


А во-вторых, пользуйся типом KeyArr из пакета, ты ж его определил.

   procedure OutPair(S: DCI.KeyArr; I: integer) is
begin
null;
end;


Цитата
Ещё нету ли в языке для каждого типа предопределённой константы, состоящей из нулей?
Нет. А зачем?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #40


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

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

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


> 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?


package pDemo is
type tDemo is (dDemo, dRelease, dTest);
type aDemo is access TDemo;
Demo: tDemo;



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

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

 





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