1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Я поставил пакет win32ada, он создал папку include\win32ada Если написать первой строкой test.gpr with "win32ada", то среда ругается при открытии пакета:
[2011-02-08 16:25:57] C:\Program Files\ADA\projects\TEST\test.gpr:1:06: unknown project file: "win32ada" [2011-02-08 16:25:57] Error while loading project 'C:\Program Files\ADA\projects\TEST\test.gpr'. Loading the default project.
Ну я это убрал. Добавил в test.gpr строчку
for Source_Dirs use ("..\..\include\win32ada\**");
Пишу в test.adb with win32.winuser (вроде все основные функции, типа окно нарисовать итд, там). Компилирую.
gnatlink "C:\Program Files\ADA\projects\TEST\test.ali" -shared-libgcc -g -g -fprofile-generate -o "C:\Program Files\ADA\projects\TEST\test.exe" c:/program files/ada/bin/../libexec/gcc/i686-pc-mingw32/4.3.6/ld.exe: cannot find -lwin32ada collect2: ld returned 1 exit status gnatlink: error when calling C:\Program Files\ADA\bin\gcc.exe gnatmake: *** link failed.
[2011-02-08 16:28:19] process exited with status 4 (elapsed time: 06.26s)
Ты ж выкрутился. Зачем тебе выносить эту функцию в параметры шаблона, расскажи? Как ты ее описывать собрался? Вот просто пример приведи, неважно, пускай некомпилируемый, как ты хочешь чтоб это работало...
Цитата
Ещё компилятор выдаёт предупреждение, если Initialize-Finalize-Adjust находятся в private -части ads файла. Что определение этой процедуры перекрывает определение на линии, где я объявил тип.
Насколько я помню, так себя ведет только GNAT, по этому поводу даже есть открытый баг в бегтрекере. Aonix ObjectAda не вякает по этому поводу. Тут есть 2 замечания: во-первых, если ты создаешь новый тип, первый в иерархии (то есть, наследуешься от Ada.Finalization.Controlled, а не от его потомка), то всегда добавляй перед прототипом описатель overriding. Во-первых, это поможет поймать опечатки, по-вторых, ты ясно указываешь компилятору, что тебе не надо перегружать функции, а надо именно заменить. И тогда предупреждение можно отключать
Во-вторых, чего не указываешь, что type Parsed_Function is tagged private; ? Он же теговый, поскольку наследуется от Controlled, который сам по себе теговый. Не, я понимаю, что компилятор сам это добавит (как и virtual в С++, если ты забыл случайно описать функцию как виртуальную в наследнике, когда у предка эта функция уже была виртуальна), но все-таки лучше делать это программисту, с первого взгляда должно быть видно, что за тип, в твоем случае этого не видно.
А вообще эта проблема (предупреждения при описании этих трех процедур в приватной части) растет вот отсюда: если у тебя есть нетэговый тип, то может быть вот такая заморочка (пример приводил Adam Beneschan)
package Pack2 is type T2 is new Pack1.T; -- для типа описана операция/процедура Op -- Естественно, T2 наследует Op
private overriding procedure Op (X : T2); end Pack2;
Теперь в зависимости от того, где будет вызываться T2.Op (в смысле, видима ли там приватная часть модуля Pack2 или нет) под P2.Op может подразумеваться разная функциональность. Где-то унаследованная от T1.Op, где-то - переопределенная.
Возможно поэтому компилятор при попытке описания функционала для потомков в приватной части (которая может быть не для всех видимой) ругается Warning-ами, не обращая особого внимания на то, где описан сам тип. Но это в любом случае баг.