Ada 类型使用“(<>)”

0 types ada

我正在查看一些遗留的 Ada 代码。

type My_Test_Type is (<>);
type My_Table_Type is array(My_Test_Type) of Integer;
Run Code Online (Sandbox Code Playgroud)

当我尝试在 GNAT 社区 IDE 中使用此代码时,出现以下错误:

ads:9:26: error: identifier expected
Run Code Online (Sandbox Code Playgroud)

这是它指向的行:

type My_Test_Type is (<>);
Run Code Online (Sandbox Code Playgroud)

当我在旧版 IDE 中构建代码时,它可以正常编译并运行。

有什么想法吗?

我仅在运行 x86_64-w64-mingw32 上托管的 GNAT Studio Community 2021 (20210423) 的本地 PC 上尝试过此操作。

遗留系统是 Power PC 的交叉编译器。它很旧了。

好的,这是更多背景信息。

我按照上面的代码创建了一个包,我正在 GNAT Studio 社区添加中构建和运行该包。

这是 my_generic.ads

package My_Generic is
 generic
   type My_Test_Type is (<>);
   type My_Table_Type is array(My_Test_Type) of Integer;
   --
   My_Table : My_Table_Type;
   procedure InitMyTable(My_Table : My_Table_Type);   
end My_Generic;
Run Code Online (Sandbox Code Playgroud)

这是 my_generic.adb

with GNAT.IO; use GNAT.IO;
package body My_Generic is
   procedure InitMyTable (My_Table : My_Table_Type) is
   begin
      Put_Line("Entered InitMyTable");
      for i in 1..1000 loop
         My_Table(i) := i + 1000;
      end loop;
      null;
   end InitMyTable;
end My_Generic;

Main is
--...
--...
   InitMyTable_i = new InitMyTable(My_Test_Type => range 1..10);
begin
--...
--...
   Put_Line ("Initializing My table (<>)");
   InitMyTable_i;

end Main;
Run Code Online (Sandbox Code Playgroud)

当我构建时出现错误:声明预期在“InitMyTable_i = new InitMyTable(My_Test_Type => range 1..10);”行上

我基本上不知道这里发生了什么。我尝试了很多不同的方法来让事情顺利进行。我找到的任何文档(包括下面建议的文档)都没有帮助。

谢谢

Sim*_*ght 5

请提供更多背景信息!

\n

这编译:

\n
generic\n   type My_Test_Type is (<>);\n   type My_Table_Type is array (My_Test_Type) of Integer;\npackage Neil is\nend Neil;\n
Run Code Online (Sandbox Code Playgroud)\n

而这(用于-gnatl列表)可能是您得到的错误:

\n
     1. package Neil is\n     2.    type My_Test_Type is (<>);\n                                 |\n        >>> error: identifier expected\n\n     3.    type My_Table_Type is array (My_Test_Type) of Integer;\n     4. end Neil;\n
Run Code Online (Sandbox Code Playgroud)\n

type T is (<>)正式的离散类型定义 ( ARM 12.5.2(2) )。对于“离散”,请参见ARM 3.2(11)

\n
\n

回答编辑后的问题,

\n

首先,请给我们一个最小的可重现示例。您的源代码main.adb无法编译\xe2\x80\x99,因此我们必须花时间猜测您的意思。

\n

其次,使用-gnatl,

\n
     1. with GNAT.IO; use GNAT.IO;\n     2. with My_Generic; use My_Generic;\n     3. procedure Main is\n     4.    InitMyTable_i = new InitMyTable(My_Test_Type => range 1..10);\n           |\n        >>> error: declaration expected\n\n     5. begin\n     6.\n     7.    Put_Line ("Initializing My table (<>)");\n     8.    InitMyTable_i;\n     9.\n    10. end Main;\n
Run Code Online (Sandbox Code Playgroud)\n

失败,因为这不是实例化通用过程的正确语法:\xe2\x80\x99t:

\n
     1. with GNAT.IO; use GNAT.IO;\n     2. with My_Generic; use My_Generic;\n     3. procedure Main is\n     4.    procedure InitMyTable_i\n     5.      is new InitMyTable(My_Test_Type => range 1..10);\n                                               |\n        >>> error: missing operand\n\n     6. begin\n     7.\n     8.    Put_Line ("Initializing My table (<>)");\n     9.    InitMyTable_i;\n    10.\n    11. end Main;\n
Run Code Online (Sandbox Code Playgroud)\n

使用正确的语法会失败,因为您没有\xe2\x80\x99t 提供一组匹配的通用实际参数:

\n
     1. with GNAT.IO; use GNAT.IO;\n     2. with My_Generic; use My_Generic;\n     3. procedure Main is\n     4.    type Test_Type is range 1 .. 10;\n     5.    procedure InitMyTable_i\n           |\n        >>> error: missing actual "My_Table_Type"\n        >>> error: in instantiation of "InitMyTable" declared at shore.ada:7\n        >>> error: instantiation abandoned\n\n     6.      is new InitMyTable(My_Test_Type => Test_Type);\n     7. begin\n     8.\n     9.    Put_Line ("Initializing My table (<>)");\n    10.    InitMyTable_i;\n           |\n        >>> error: "InitMyTable_i" is undefined\n\n    11.\n    12. end Main;\n
Run Code Online (Sandbox Code Playgroud)\n

可以这样修复:

\n
     1. with GNAT.IO; use GNAT.IO;\n     2. with My_Generic; use My_Generic;\n     3. procedure Main is\n     4.    type Test_Type is range 1 .. 10;\n     5.    type Table_Type is array (Test_Type) of Integer;\n     6.    Table_Instance : Table_Type;\n     7.    procedure InitMyTable_i\n     8.      is new InitMyTable(My_Test_Type => Test_Type,\n     9.                         My_Table_Type => Table_Type,\n    10.                         My_Table => Table_Instance);\n    11. begin\n    12.\n    13.    Put_Line ("Initializing My table (<>)");\n    14.    InitMyTable_i;\n           |\n        >>> error: missing argument for parameter "My_Table" in call to "Initmytable_I" declared at line 7\n\n    15.\n    16. end Main;\n
Run Code Online (Sandbox Code Playgroud)\n

并且

\n
     1. package My_Generic is\n     2.  generic\n     3.    type My_Test_Type is (<>);\n     4.    type My_Table_Type is array(My_Test_Type) of Integer;\n     5.    --\n     6.    My_Table : My_Table_Type;\n     7.    procedure InitMyTable(My_Table : My_Table_Type);\n                                 |\n        >>> error: "My_Table" conflicts with declaration at line 6\n\n     8. end My_Generic;\n
Run Code Online (Sandbox Code Playgroud)\n

因此,有两件事发生:您不应该My_Table在泛型中声明形式对象(即过程参数的用途):

\n
     1. package My_Generic is\n     2.  generic\n     3.    type My_Test_Type is (<>);\n     4.    type My_Table_Type is array(My_Test_Type) of Integer;\n     5.    procedure InitMyTable(My_Table : My_Table_Type);\n     6. end My_Generic;\n\n
Run Code Online (Sandbox Code Playgroud)\n

\n
     1. with GNAT.IO; use GNAT.IO;\n     2. with My_Generic; use My_Generic;\n     3. procedure Main is\n     4.    type Test_Type is range 1 .. 10;\n     5.    type Table_Type is array (Test_Type) of Integer;\n     6.    procedure InitMyTable_i\n     7.      is new InitMyTable(My_Test_Type => Test_Type,\n     8.                         My_Table_Type => Table_Type);\n     9.    Table_Instance : Table_Type;\n           |\n        >>> warning: variable "Table_Instance" is read but never assigned [-gnatwv]\n\n    10. begin\n    11.\n    12.    Put_Line ("Initializing My table (<>)");\n    13.    InitMyTable_i (My_Table => Table_Instance);\n    14.\n    15. end Main;\n
Run Code Online (Sandbox Code Playgroud)\n

\n
     1. with GNAT.IO; use GNAT.IO;\n     2. package body My_Generic is\n     3.    procedure InitMyTable (My_Table : My_Table_Type) is\n     4.    begin\n     5.       Put_Line("Entered InitMyTable");\n     6.       for i in 1..1000 loop\n     7.          My_Table(i) := i + 1000;\n                          |\n        >>> error: expected type "My_Test_Type" defined at my_generic.ads:3\n        >>> error: found type "Standard.Integer"\n\n     8.       end loop;\n     9.       null;\n    10.    end InitMyTable;\n    11. end My_Generic;\n
Run Code Online (Sandbox Code Playgroud)\n

要解决此问题,您需要将第 6 行更改为循环My_Table\xe2\x80\x99Range(或可能结束My_Table_Type),给出

\n
     6.       for i in My_Table\'Range loop\n     7.          My_Table(i) := i + 1000;\n                 1              2\n        >>> error: assignment to "in" mode parameter not allowed\n        >>> error: expected type universal integer\n        >>> error: found type "My_Test_Type" defined at my_generic.ads:3\n\n     8.       end loop;\n
Run Code Online (Sandbox Code Playgroud)\n

交给你了!

\n