繁体   English   中英

Ada通用形式子程序

[英]Ada Generic Formal Subprograms

我正在上学的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 ,但在何处以及如何?

所提供的通用单元声明既是一个正式的类型和和正式的子程序 ,所以它的通用实例 同时需要一个实际的类型和实际子程序。 您的实际类型是FrequencyRecord ; 您的实际子程序应该是接受实际类型的参数FrequencyRecord 然后,您可以使用所需的实际参数实例化 Tree_Pkg

type FrequencyRecord is …;

procedure Put(I : FrequencyRecord) is
begin
   …
end;

package FrequencyTree is new Tree_Pkg (FrequencyRecord, Put);

附录:如此此处所述,实际子程序的配置文件必须与正式子程序的配置文件一致,但名称可能有所不同。

关于位置和方式,在研究了垃圾神的答案之后 ,请考虑以下事项:

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

确实必须在执行此实例化之前, FrequencyRecordYourOwnPut必须存在:这里的Ada编译器YourOwnPut读取您的Ada文本,因此,当它看到实例化时,它必须早先已经看到了两者。

这要求意味着你要么定义YourOwnPut的实例之前,文本行Tree_Pkg ,使这两个类型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,如果将Frequency_Stuff.FrequencyRecord Item_Type的实际参数,而Frequency_Stuff.YourOwnPut Item_Type Put的实际参数,则这些实际参数已经存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM