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类型范围内的所有索引并复制相应的数组索引,还是有另一种聪明的方法?

4

3 回答 3

5

教程在幻灯片 3 上说,“所有数组都是(双重)类型的”,这意味着 - 像往常一样,对于不同的类型 - 您不能在两种数组类型之间进行分配;所以是的,你需要一个循环。

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

于 2013-10-13T11:38:02.077 回答
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;
于 2013-10-13T11:58:10.737 回答
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;

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

于 2013-10-13T11:35:20.220 回答