Generics Ada通用形式子程序
我正在为学校做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
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
。如果你做了至于何处以及如何,在学习之后,考虑以下工作:
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
的实际参数,则这些实际参数已经存在