首页 文章

Ada Generic正式子程序

提问于
浏览
0

我正在为学校做Ada任务 . 我的老师为我提供了以下代码 . 这是一个通用树 .

generic
    type Item_Type is private;
    with procedure put(i : Item_Type);

我在我的测试文件中创建了一个新的通用树,就像这样 .

package FrequencyTree is new Tree_Pkg (FrequencyRecord);
use FrequencyTree;

现在我收到以下错误 .

treetest.adb:12:01: missing actual "put"
treetest.adb:12:01: in instantiation of "Tree_Pkg" declared at tree_pkg.ads:4
treetest.adb:12:01: instantiation abandoned

我知道我应该在某个地方以某种方式实现这个程序 put ,但在哪里以及如何?

2 回答

  • 3

    提供的通用单元声明formal typeformal subprogram,因此其通用instantiation需要实际类型和实际子程序 . 您的实际类型是 FrequencyRecord ;您的实际子程序应该是一个接受实际类型参数的过程 FrequencyRecord . 然后你可以用所需的实际参数instantiate Tree_Pkg .

    type FrequencyRecord is …;
    
    procedure Put(I : FrequencyRecord) is
    begin
       …
    end;
    
    package FrequencyTree is new Tree_Pkg (FrequencyRecord, Put);
    

    附录:如上所述herehere,实际子程序的概况必须符合正式子程序的概况,但名称可能不同 .

  • 2

    至于在研究trashgod's answer之后的地点和方式,请考虑以下方法:

    package FrequencyTree is new Tree_Pkg
      (Item_Type => FrequencyRecord, 
       Put       => YourOwnPut);
    

    在你进行这个实例化之前,必须确实存在:这里的Ada编译器从头到尾读取你的Ada文本,所以当它看到实例化时,它必须先看到它们 .

    此要求意味着您要在实例化 Tree_Pkg 之前在文本行上定义 YourOwnPut ,以使实例化行之前存在类型 FrequencyRecord 和过程 YourOwnPut . 或者,可能选择了一些替代安排:例如,如果 FrequencyRecordYourOwnPut 可以放在一个单独的包中,那么你就可以在任何编译单元的上下文子句中包装你的实例化行 . (根据错误消息判断,它可能被称为 Treetest . )说,

    with Frequency_Stuff;
    
    ...
       package FrequencyTree is new Tree_Pkg
         (Item_Type => Frequency_Stuff.FrequencyRecord, 
          Put       => Frequency_Stuff.YourOwnPut);
    

    因此,当您执行此实例化时,编译器已经看到并编译了包 Frequency_Stuff . IOW,如果 Item_Type 的实际参数 Frequency_Stuff.FrequencyRecordPut 的实际参数 Frequency_Stuff.YourOwnPut ,那么这些实际参数已经存在 .

相关问题