简而言之,为什么这不起作用:
generic
Max : in Positive;
package Modular_Gen_Issue is
procedure Foo;
private
type Mod_Thing is mod Max; -- NOK
type Int_Thing is new Integer range 0 .. Max; -- OK
end Modular_Gen_Issue;
与编译:
$ gnatmake modular_gen_issue.ads
gcc-4.4 -c modular_gen_issue.ads
modular_gen_issue.ads:6:26: non-static expression used for modular type bound
modular_gen_issue.ads:6:26: "Max" is not static constant or named number (RM 4.9(5))
gnatmake: "modular_gen_issue.ads" compilation error
$
如何传入单个数字并使用它来定义模块化类型?
是的,它必须是模块化的!
最佳答案
对不起,你不能。每当您声明模块化类型时,模数必须是一个静态值,即编译器可以立即计算出的值。这不起作用。这适用于类型声明的许多部分,尤其是编译器需要的部分,以便确定一个对象需要多少位,或有关对象表示的其他功能。另一方面,在 Int_Thing 中,范围的上限不需要是静态的(编译器已经知道 Int_Thing 将表示为与 Integer 相同的形式,并且范围用于边界检查但未使用)以确定 Int_Thing 有多大)。
如果这是现实生活中的情况,并且您需要一个可以处理不同模块化类型的泛型,您可以将模块化类型本身设置为泛型参数:
generic
type Mod_Thing is mod <>;
package Modular_Gen_Issue is ...
(PS:示例中 Mod_Thing 的范围是 0..Max-1,而不是 0..Max。)
关于ada - 在通用包中定义模块化类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17064479/