Ada中的Unchecked_Conversion

3

请问有人能够让我清楚地了解Ada语言中未经检查的转换用法吗?我已经尝试了PDF和网络搜索,但是都没有给我清晰的印象。

现在我有一小段代码如下所示:

subtype Element4_Range is integer range 1..4;
subtype Element3_Range is integer range 1..3;
subtype Myarr_Range is integer range 1..10;
type Myarr3_Type is array (Myarr_Range) of Element3_Range;
type Myarr4_Type is array (Myarr_Range) of Element4_Range;
Myarr3 : Myarr3_Type;
Myarr4 : Myarr4_Type := (1, 2, 3, 3, 1, 3, 2, 1, 2, 1);
Count_1 : Integer := 0;
Count_2 : Integer := 0;
Count_3 : Integer := 0;
*function To_Myarr3 is new Unchecked_Conversion(Myarr4_type, Myarr3_type);*

现在我的疑问是,函数Myarr3到底是做什么的?
2个回答

3

Unchecked_Conversion的实例将源值的字节复制到目标,而不检查是否合理。一些编译器可能会发出警告(取决于编译选项)如果值的大小不同。

Element3_RangeElement4_Range都基于Integer,并且将使用相同数量的字节; 因此,您的两个数组变量(Myarr3Myarr4)将需要相同数量的字节(通常为40)。

您可以这样写

Myarr3 := To_Myarr3 (Myarr4);

目前情况下,不会发生任何问题,因为您用来初始化Myarr4的所有值都是Element3_Range的合法值。

但是,如果您有以下这种情况:

Myarr3 := To_Myarr3 (Myarr4'(1, 2, 3, 4, others => 1));

如果你不小心这样写:Myarr3(4) 超出了 Element3_Range 的合法范围,而编译器却认为它是合法的。这可能导致后续出现 Constraint_Error

你可以自己强制进行检查:

if not Myarr3 (4)'Valid then
  -- handle the error case

2

我曾经有一个同事坚持认为unchecked_conversion 应该被命名为“Unchcked_Copy”。它所做的只是将一个类型的对象复制到另一个类型的对象中。

因此,你的 To_Myarr3 程序将接受一个 Myarr4 类型的数组作为参数,假装它是一个 Myarr3 类型的数组,然后将它的每个元素复制到表达式的左侧。

如果你想要改变对象的视图,从一个类型转换为另一个类型而不必拷贝整个对象,你可以对它们的访问类型使用 Unchecked_Conversion(这样你只需要复制指向它们的指针)。另一种方法是使用 for object_name'address use at 将一个对象覆盖在另一个对象上(但它们可能都会被初始化,这可能是有问题的)。但真正的最佳方法是设计你的系统类型,使得你永远不必使用 Unchecked_Conversion


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接