Generics 如何(可以?)基于“a”导出Ada类型;新";从泛型输入?

Generics 如何(可以?)基于“a”导出Ada类型;新";从泛型输入?,generics,declaration,ada,Generics,Declaration,Ada,我很确定这是一个新Ada人的陷阱。我觉得有一些简单的事情需要做对。我有一些较旧的代码,其中包含基于Ada.Strings.Bounded泛型模块的Send\u Command过程的声明,该过程具有Command\u String\u Type类型参数 旧的 ----command.ads---- --与此无关,Send_命令在模块内部。 : ----command.adb---- --键入以在构造命令时保留要发送的命令。 包命令\u字符串\u类型为 新的Ada.Strings.Bounded.G

我很确定这是一个新Ada人的陷阱。我觉得有一些简单的事情需要做对。我有一些较旧的代码,其中包含基于Ada.Strings.Bounded泛型模块的Send\u Command过程的声明,该过程具有Command\u String\u Type类型参数

旧的

----command.ads----
--与此无关,Send_命令在模块内部。
:
----command.adb----
--键入以在构造命令时保留要发送的命令。
包命令\u字符串\u类型为
新的Ada.Strings.Bounded.Generic_Bounded_Length(Max=>Command_Max);
:
:
程序发送命令(
命令字符串:在命令字符串中(类型为有界字符串);
此:命令\u字符串\u类型用作此模块必须从此模块导出的发送\u命令过程的参数类型

当我试图在模块规范(.ads)文件中声明命令字符串类型时,我的问题就来了。我无法直接获取“导出”此过程的类型规范的语法

目标

----command\u interface.ads----
软件包命令_接口不可用
命令_Max:常数:=200;
:
--想要。。。从此模块导出命令\字符串\类型
--键入以在构造命令时保留要发送的命令。
包命令\u字符串\u类型为
新的Ada.Strings.Bounded.Generic_Bounded_Length(Max=>Command_Max);
:
:
程序发送命令(
命令字符串:在命令字符串中(类型为有界字符串);
:
结束命令_接口;——规范
----command_interface.adb----
包体命令\u接口不可用
:
程序发送命令(
命令\u字符串:在命令\u字符串\u类型中。有界\u字符串)
是
开始
:
--实施。。。
:
结束发送命令;
终端命令接口--包裹
很自然,Ada-95编译器需要如上所示的“命令字符串类型”。想要将Send_命令过程放入Command_接口包中。并将其导出以供其他模块使用。此过程取决于命令\u字符串\u类型

  • 首先我直接粘贴了包命令_String _typeis new Ada.Strings。。。构造--和收到的错误。
    • 这就是上面“目标”标题下的代码
  • 我认为.ADS文件中的类型声明会起作用,因为错误会抱怨“无类型”——我也有错误
  • 然后,我还使用了子类型
  • (更新…)将命令\字符串\类型声明为私有--仍有编译错误
  • 我的最后一个努力是使Command_String_Type_XX子类型成为Command_String_Type,这样我就可以在声明中公开子类型

  • 到目前为止,我五个人都没有。我一直在阅读书籍和阅读培训笔记,我很失望我找不到从有界字符串“导出”字符串类型的示例——当然,我仍在寻找,但我开始怀疑我所认为的是否像在其他语言中一样简单。Ada是否允许这样做。提前感谢您的建议。

    您建议的规格看起来不错:

    带有Ada.Strings.Bounded;
    软件包命令_接口不可用
    命令_Max:常数:=200;
    包命令\u字符串\u类型为
    新的Ada.Strings.Bounded.Generic_Bounded_Length(Max=>Command_Max);
    程序发送命令
    (命令字符串:在命令字符串类型中。有界字符串);
    终端命令接口;
    
    身体也是如此(当然,这是一个演示):

    带有Ada.Text\u IO;
    包体命令\u接口不可用
    程序发送命令
    (命令字符串:在命令字符串类型中。有界字符串)为
    开始
    Ada.Text_IO.Put_行(命令字符串类型)到字符串(命令字符串));
    结束发送命令;
    终端命令接口;
    
    现在我们开始使用它。您已经在
    Command\u Interface
    的可见部分创建了包
    Command\u String\u Type
    ,因此可以将其引用为
    Command\u Interface。Command\u String\u Type

    带命令界面;
    程序检查\u命令\u接口不可用
    开始
    命令\接口。发送\命令
    (Command_Interface.Command_String_Type.To_Bounded_String(“hello!”);
    结束检查命令界面;
    
    你可能认为这一切都有点冗长。您可以缩短实例化的名称,例如

    package命令无效
    新的Ada.Strings.Bounded.Generic_Bounded_Length(Max=>Command_Max);
    
    或者你可以在通话附近使用软件包重命名技巧

    程序检查\u命令\u接口\u 2
    包CICST重命名命令\接口。命令\字符串\类型;
    开始
    Command_Interface.Send_Command(CICST.To_-Bounded_字符串(“hello!”);
    结束检查\u命令\u接口\u 2;
    
    或者,您可以过火地使用

    程序检查\u命令\u接口\u 3
    使用命令\接口。命令\字符串\类型;
    开始
    Command_Interface.Send_命令(发送到字符串(“hello!”);
    结束检查\u命令\u接口\u 3;
    
    您建议的规范看起来不错:

    带有Ada.Strings.Bounded;
    软件包命令_接口不可用
    命令_Max:常数:=200;
    包命令\u字符串\u类型为
    新的Ada.Strings.Bounded.Generic_Bounded_Length(Max=>Command_Max);
    程序发送命令
    (命令字符串:在命令字符串类型中。有界字符串);
    终端命令接口;
    
    身体也是如此(当然,这是一个演示):

    带有Ada.Text\u IO;
    包体命令\u接口不可用
    程序发送命令
    (命令字符串:在命令字符串类型中。有界字符串)为
    开始
    Ada.Text\u IO.Put\u行(命令字符串类型到字符串