ada - 在通用包中定义模块化类型

标签 ada

简而言之,为什么这不起作用:

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 ...

(P.S.示例中 Mod_Thing 的范围为 0..Max-1,而不是 0..Max。)

关于ada - 在通用包中定义模块化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17064479/

相关文章:

if-statement - 为什么 ada 中的 if 表达式和 if 语句也适用于 case

generics - Ada:具有可变大小数组属性的对象

ada - 无法访问私有(private)类型的属性

ada - 操作只能以一种类型进行调度

ada - 使用 AVR-Ada 执行任务

ada - 无法访问 Ada 泛型参数的成员

compiler-errors - 这个 Ada 程序有什么错误?

artificial-intelligence - Ada 中的 AI 库框架

ada - 如何在ada中分配除一个元素之外的所有元素?

ada - 如何使用 ASIS 找到记录中字符串字段的 `' First` 和 `' Last` 表达式