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

时间:2013-10-13 11:12:14

标签: arrays ada assign

我正在学习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 个答案:

答案 0 :(得分:5)

{3}}在幻灯片3中说“所有数组都是(双重)类型”,这意味着 - 通常用于不同类型 - 你不能在两种数组类型之间进行分配;所以是的,你需要一个循环。

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

答案 1 :(得分: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;

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

答案 2 :(得分:3)

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

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;