Generics Ada通用形式子程序

Generics Ada通用形式子程序,generics,tree,procedure,ada,Generics,Tree,Procedure,Ada,我正在为学校做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 a

我正在为学校做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

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

提供的泛型单元同时声明了a和a,所以它的泛型需要一个实际类型和一个实际子程序。您的实际类型是
FrequencyRecord
;实际子程序应该是一个接受实际类型参数的过程,
FrequencyRecord
。然后,您可以使用所需的实际参数
Tree\u Pkg

type FrequencyRecord is …;

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

package FrequencyTree is new Tree_Pkg (FrequencyRecord, Put);

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

提供的通用单元同时声明a和a,因此其通用性要求实际类型和实际子程序。您的实际类型是
FrequencyRecord
;实际子程序应该是一个接受实际类型参数的过程,
FrequencyRecord
。然后,您可以使用所需的实际参数
Tree\u Pkg

type FrequencyRecord is …;

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

package FrequencyTree is new Tree_Pkg (FrequencyRecord, Put);

附录:如前所述,实际子程序的轮廓必须符合正式子程序,但名称可能有所不同。

< P>关于在何处和如何,在学习之后,考虑以下工作:

package FrequencyTree is new Tree_Pkg
  (Item_Type => FrequencyRecord, 
   Put       => YourOwnPut);
确实,在您执行此实例化之前,
FrequencyRecord
YourOwnPut
必须存在:这里的Ada编译器从头到尾读取您的Ada文本,因此当它看到实例化时,它必须看到前面的两个

此要求意味着您可以在实例化
Tree\u Pkg
之前在文本行上定义
YourOwnPut
,以使类型
frequencycrecord
和过程
YourOwnPut
都存在于实例化行之前。或者,可以选择一些替代安排:例如,如果
FrequencyRecord
YourOwnPut
可以放在一个单独的包中,那么您可以在实例化行周围任何编译单元的上下文子句中使用该包。(根据错误消息判断,它可能被称为
Treetest


因此,当您执行此实例化时,编译器已经看到并编译了包
Frequency\u Stuff
。如果你做了频率的事,频率记录 <代码>实际参数> >和频率>。YouRunnPuth/<代码>实际的参数>代码>放置/代码>,然后这些实际参数已经存在。

至于何处以及如何,在学习之后,考虑以下工作:

package FrequencyTree is new Tree_Pkg
  (Item_Type => FrequencyRecord, 
   Put       => YourOwnPut);
确实,在您执行此实例化之前,
FrequencyRecord
YourOwnPut
必须存在:这里的Ada编译器从头到尾读取您的Ada文本,因此当它看到实例化时,它必须看到前面的两个

此要求意味着您可以在实例化
Tree\u Pkg
之前在文本行上定义
YourOwnPut
,以使类型
frequencycrecord
和过程
YourOwnPut
都存在于实例化行之前。或者,可以选择一些替代安排:例如,如果
FrequencyRecord
YourOwnPut
可以放在一个单独的包中,那么您可以在实例化行周围任何编译单元的上下文子句中使用该包。(根据错误消息判断,它可能被称为
Treetest

因此,当您执行此实例化时,编译器已经看到并编译了包
Frequency\u Stuff
。因此,如果将
频率\u Stuff.FrequencyRecord
作为
项目类型的实际参数,将
频率\u Stuff.YourOwnPut
作为
Put
的实际参数,则这些实际参数已经存在