首页 文章

在Ada中复制相同类型和大小但不同索引类型的数组

提问于
浏览
0

我正在学习Ada,目前的课程是关于阵列的 . 考虑以下计划;

procedure Main is
   type T_Bool is array (Boolean) of Integer;
   type T_Intg is array (Integer range 1 .. 2) of Integer;
   A1 : T_Bool := (others => 0);
   A2 : T_Intg := (others => 0);
begin
   -- None of these statements work
   A2 := A1;
   A2 (1 .. 2) := A1 (false .. true);
   A2 := A1 (Boolean'First .. Boolean'Last);
end Main;

根据Adacore大学的导师,只要长度相同,就可以将值从一个数组复制到另一个数组 . 在代码片段中,为什么不分配具有相同大小但不同索引方法的数组,尽管长度相同?

复制这个的正确方法是什么?是循环遍历 Boolean 类型范围内的所有索引并复制相应的数组索引还是另一种聪明的方法呢?

3 回答

  • 3

    tutorial在幻灯片3上说"all arrays are (doubly) typed",这意味着 - 像往常一样用于不同类型 - 你不能在两种数组类型之间分配;所以是的,你需要一个循环 .

    有一些“聪明”的方法,例如,使用未经检查的转换;但是,真的,不要去那里!

  • 3

    如果数组具有相同的类型和长度且只有起始索引不同,则可以复制没有任何显式转换的数组:

    procedure Test is
        type T is array (Positive range <>) of Integer;    
        A : T(1 .. 10);
        B : T(21 .. 30);
    begin
        A := B;
    end Test;
    

    否则,可以使用显式转换分配不同类型的数组,但除了具有相同的维度(以及更多,请参阅ARM 4.6)之外,索引类型也必须是可转换的 . Boolean是枚举类型,不能转换为Integer .

    使用可转换索引类型的显式转换如下所示:

    procedure Main is
       type TMod is mod 10000;
       type T_Mod is array (TMod range 5000 .. 5001) of Integer;
       type T_Intg is array (Integer range 1 .. 2) of Integer;
       A1 : T_Mod := (others => 0);
       A2 : T_Intg := (others => 0);
    begin
       A2 := T_Intg(A1);
    end Main;
    

    所以是的,看起来你需要在你的例子中循环复制元素 .

  • 5

    感谢您的回答,这绝对是有用的信息 . 它比我想象的更深 . 在本教程的测验部分,我了解到即使这是一个错误

    procedure Main is
       type T1 is array (Integer range 1 .. 10) of Integer;
       type T2 is array (Integer range 1 .. 10) of Integer;
       A1 : T1;
       A2 : T2;
    begin
       A1 := (others => 0);
       -- Cannot do this
       A2 := A1;
    end Main;
    

    类型 A2A1 可能以相同的方式定义,但Ada认为它们不相关,因此不兼容 . 这将是C中的等价物

    typedef int MyType1;
    typedef int MyType2;
    MyType1 MyVar1;
    MyType2 MyVar2;
    // Error - Cannot assign differing types,
    // despite them being semantically the same
    MyVar2 = MyVar1;
    

相关问题