3

谁能告诉我在 Ada 语言中使用未经检查的转换。我试过 pdf 和 net,但都没有给我一个清晰的画面。

  Now i have a small piece of code shown below:

    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 函数究竟做了什么?

4

2 回答 2

3

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

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

你可以写

Myarr3 := To_Myarr3 (Myarr4);

就目前而言,不会发生任何不好的事情,因为您用来初始化的所有值Myarr4都是合法的Element3_Range.

但是,如果你有

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

你最终会Myarr3(4)包含一个超出合法范围的值Element3_Range,并且编译器没有理由相信它可能无效。这很可能导致Constraint_Errors 下线。

您可以自己强制检查:

if not Myarr3 (4)'Valid then
  -- handle the error case
于 2010-04-20T11:40:33.700 回答
2

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

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

如果您想将对象的视图从一种类型更改为另一种类型而不复制整个该死的东西,您可以在访问类型上为它们使用 Unchecked_Conversion(因此您只是复制指向它们的指针)。另一种方法是使用for object_name'address use at一个覆盖另一个(但是,它们可能都被初始化,这可能很糟糕)。但实际上最好的方法是设计系统的类型,这样您就不必使用 Unchecked_Conversion

于 2010-04-20T17:58:22.583 回答