Строительство класса с заданием собственности в Аде 2005 - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть класс Test_Class в Ada 2005, который имеет свойство задачи, связанное с родителями, с именем Primary, от типа Primary_Task, определяемое как:

   type Test_Class is tagged limited
      record
         Info    : Integer;
         Value   : Float;
         Primary : Primary_Task (Test_Class'Access);
      end record;

Мне нужно создать одношаговый конструкторкласс в виде

   function Construct (T : access Test_Class) return Test_Class_Ptr is
   begin
      return new Test_Class'(Info => T.Info + 1,
                             Value => 0.0,
                             Primary => [WHAT I WANNA KNOW]);
   end Construct;

В настоящее время мой код:

-- test_pkg.ads
package Test_Pkg is
   type Test_Class;
   type Test_Class_Ptr is access all Test_Class;

   task type Primary_Task (This_Test : access Test_Class) is
      pragma Storage_Size (1000);
   end Primary_Task;

   type Test_Class is tagged limited
      record
         Info    : Integer;
         Value   : Float;
         Primary : Primary_Task (Test_Class'Access);
      end record;

   function Construct (T : access Test_Class) return Test_Class_Ptr;
end Test_Pkg;

-- test_pkg.adb
with Text_IO; use Text_IO;
package body Test_Pkg is
   [...]

   function Construct (T : access Test_Class) return Test_Class_Ptr is
      T_Ptr : constant Test_Class_Ptr := new Test_Class;
   begin
      T_Ptr.Info := T.Info + 1;
      T_Ptr.Value := 0.0;
      return T_Ptr;
   end Construct;
end Test_Pkg;

Итак, как я могу его кодировать?Что я должен вставить в Primary => [...] код?Должен ли я изменить определение Primary : Primary_Task (Test_Class'Access); в Test_Class определении?

1 Ответ

1 голос
/ 09 ноября 2011

Я получил ответ от Рэнди Брукардта (спасибо) на comp.lang.ada:

В Аде 2005 или более поздней версии используйте «<>» для инициализации компонента по умолчанию в агрегате (это единственное, что вы можете сделать с задачей).

(...)

function Construct (T : access Test_Class) return Test_Class_Ptr is
begin
 return new Test_Class'(Info => T.Info + 1,
                       Value => 0.0,
                       Primary => <>);
end Construct;

Однако я попытался скомпилировать ее с использованием GNAT GPL 2011 и получилGNATBUG ниже

c:\tst>gnatmake -gnat12 test_pkg.adb
gcc -c -gnat12 test_pkg.adb

+===========================GNAT BUG DETECTED==============================+
| GPL 2011 (20110428) (i686-pc-mingw32) GCC error:                         |
| in create_tmp_var, at gimplify.c:505                                     |
| Error detected around test_pkg.adb:20:29                          |
| Please submit a bug report by email to report@adacore.com.               |
| GAP members can alternatively use GNAT Tracker:                          |
| http://www.adacore.com/ section 'send a report'.                         |
| See gnatinfo.txt for full info on procedure for submitting bugs.         |
| Use a subject line meaningful to you and us to track the bug.            |
| Include the entire contents of this bug box in the report.               |
| Include the exact gcc or gnatmake command that you entered.              |
| Also include sources listed below in gnatchop format                     |
| (concatenated together with no headers between files).                   |
| Use plain ASCII or MIME attachment.                                      |
+==========================================================================+
Please include these source files with error report
Note that list may not be accurate in some cases,
so please double check that the problem can still
be reproduced with the set of files listed.
Consider also -gnatd.n switch (see debug.adb).

test_pkg.adb
test_pkg.ads

raised TYPES.UNRECOVERABLE_ERROR : comperr.adb:423
gnatmake: "test_pkg.adb" compilation error

Поэтому пользователям GNAT GPL, возможно, придется подождать следующего выпуска, чтобы использовать это решение.

...