首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ada中的Unchecked_Conversion

Ada中的Unchecked_Conversion
EN

Stack Overflow用户
提问于 2010-04-20 14:35:55
回答 2查看 5.7K关注 0票数 3

有没有人可以告诉我在Ada语言中使用未检查转换的用法。我已经尝试了pdf和net,但都不能给我一个清晰的画面。

代码语言:javascript
复制
  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到底做了什么?

EN

回答 2

Stack Overflow用户

发布于 2010-04-20 19:40:34

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

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

你可以写

代码语言:javascript
复制
Myarr3 := To_Myarr3 (Myarr4);

现在看来,不会有什么不好的事情发生,因为您用来初始化Myarr4的所有值作为Element3_Range的值都是合法的。

然而,如果你有

代码语言:javascript
复制
Myarr3 := To_Myarr3 (Myarr4'(1, 2, 3, 4, others => 1));

您最终会得到包含Element3_Range合法范围之外的值的Myarr3(4),并且编译器没有理由相信它可能是无效的。这很可能导致Constraint_Error的下线。

你可以自己强制检查:

代码语言:javascript
复制
if not Myarr3 (4)'Valid then
  -- handle the error case
票数 3
EN

Stack Overflow用户

发布于 2010-04-21 01:58:23

我曾经有一位同事鼓动我应该把unchecked_conversion命名为"Unchcked_Copy“。它所做的就是将一种类型的对象复制到另一种类型的对象中。

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

如果您想要将对象的视图从一种类型更改为另一种类型,而不复制整个补丁内容,则可以对它们的访问类型使用Unchecked_Conversion (因此,您只需复制指向它们的指针)。另一种方法是使用for object_name'address use at将一个覆盖在另一个上(但是,它们都可能被初始化,这可能是不好的)。但实际上最好的方法是对系统类型进行设计,这样您就永远不需要使用Unchecked_Conversion

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2673065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档