我正在查看一些遗留的 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);”行上
我基本上不知道这里发生了什么。我尝试了很多不同的方法来让事情顺利进行。我找到的任何文档(包括下面建议的文档)都没有帮助。
谢谢
请提供更多背景信息!
\n这编译:
\ngeneric\n type My_Test_Type is (<>);\n type My_Table_Type is array (My_Test_Type) of Integer;\npackage Neil is\nend Neil;\nRun Code Online (Sandbox Code Playgroud)\n而这(用于-gnatl列表)可能是您得到的错误:
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;\nRun Code Online (Sandbox Code Playgroud)\ntype T is (<>)是正式的离散类型定义 ( ARM 12.5.2(2) )。对于“离散”,请参见ARM 3.2(11)。
回答编辑后的问题,
\n首先,请给我们一个最小的可重现示例。您的源代码main.adb无法编译\xe2\x80\x99,因此我们必须花时间猜测您的意思。
其次,使用-gnatl,
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;\nRun 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;\nRun 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;\nRun 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;\nRun 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;\nRun Code Online (Sandbox Code Playgroud)\n因此,有两件事发生:您不应该My_Table在泛型中声明形式对象(即过程参数的用途):
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\nRun 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;\nRun 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;\nRun Code Online (Sandbox Code Playgroud)\n要解决此问题,您需要将第 6 行更改为循环My_Table\xe2\x80\x99Range(或可能结束My_Table_Type),给出
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;\nRun Code Online (Sandbox Code Playgroud)\n交给你了!
\n