Arrays 有没有一种方法可以像a(I)而不是a(a';First+;I)那样在数组中写入索引?

Arrays 有没有一种方法可以像a(I)而不是a(a';First+;I)那样在数组中写入索引?,arrays,ada,Arrays,Ada,我必须编写A(A'First+I)以独立于索引定义。当它们很多的时候,读起来会有点困难。一个简单的小例子: 过程点累积(A:数字数组;B:数字数组;N:自然;R:输入输出数字)为 开始 因为我在0。。N-1环 R:=R+A(A'First+I)*B(B'First+I); 端环; 结束; 我希望代码看起来像这样: 过程点累积(A:数字数组;B:数字数组;N:自然;R:输入输出数字)为 开始 因为我在0。。N-1环 R:=R+A(I)*B(I); 端环; 结束; 由于重复的a'First+I如

我必须编写
A(A'First+I)
以独立于索引定义。当它们很多的时候,读起来会有点困难。一个简单的小例子:

过程点累积(A:数字数组;B:数字数组;N:自然;R:输入输出数字)为
开始
因为我在0。。N-1环
R:=R+A(A'First+I)*B(B'First+I);
端环;
结束;
我希望代码看起来像这样:

过程点累积(A:数字数组;B:数字数组;N:自然;R:输入输出数字)为
开始
因为我在0。。N-1环
R:=R+A(I)*B(I);
端环;
结束;

由于重复的a'First+I

如果Number\u Array是受约束的数组类型,代码行可能会比我给出的示例宽很多,只需执行以下操作:

for I in Number_Array'Range loop
   R := R + A(I) * B(I);
end loop;
编辑:

如果您不介意额外的复制,可以对无约束数组执行此操作(请注意,
N
是如何通过获取最短数组的长度来消除的):


如果
Number\u Array
是受约束的数组类型,只需执行以下操作:

for I in Number_Array'Range loop
   R := R + A(I) * B(I);
end loop;
编辑:

如果您不介意额外的复制,可以对无约束数组执行此操作(请注意,
N
是如何通过获取最短数组的长度来消除的):


如果
Number\u Array
是受约束的数组类型,只需执行以下操作:

for I in Number_Array'Range loop
   R := R + A(I) * B(I);
end loop;
编辑:

如果您不介意额外的复制,可以对无约束数组执行此操作(请注意,
N
是如何通过获取最短数组的长度来消除的):


如果
Number\u Array
是受约束的数组类型,只需执行以下操作:

for I in Number_Array'Range loop
   R := R + A(I) * B(I);
end loop;
编辑:

如果您不介意额外的复制,可以对无约束数组执行此操作(请注意,
N
是如何通过获取最短数组的长度来消除的):


一个简单的选择是首先修复
数字\u数组

type Number_Array is array (Positive range <>) of Number
  with Dynamic_Predicate => Number_Array'First = 1;

但除此之外,你的例子令人难以置信地丑陋。你到底想做什么?

一个简单的选择是首先修复
数字数组:

type Number_Array is array (Positive range <>) of Number
  with Dynamic_Predicate => Number_Array'First = 1;

但除此之外,你的例子令人难以置信地丑陋。你到底想做什么?

一个简单的选择是首先修复
数字数组:

type Number_Array is array (Positive range <>) of Number
  with Dynamic_Predicate => Number_Array'First = 1;

但除此之外,你的例子令人难以置信地丑陋。你到底想做什么?

一个简单的选择是首先修复
数字数组:

type Number_Array is array (Positive range <>) of Number
  with Dynamic_Predicate => Number_Array'First = 1;

但除此之外,你的例子令人难以置信地丑陋。你到底想做什么?

这是另一种选择:

procedure Dot_累计(A:Number_数组;B:Number_数组;R:in-out Number)
Pre=>A'长度=B'长度;
程序点累积(A:数字数组;B:数字数组;R:输入输出数字)为
子类型公共_范围是数字_数组(1..A'长度);
Ax:地址=>A'地址的公共_范围;
Bx:地址=>B'地址的公共_范围;
开始
对于公共_Range'Range循环中的I
R:=R+Ax(I)*Bx(I);
端环;
结束;

确保A和B具有相同的长度,因此无需传递N参数。我认为这不会降低性能,因为Ax使用的内存与A相同。

这是另一种选择:

procedure Dot_累计(A:Number_数组;B:Number_数组;R:in-out Number)
Pre=>A'长度=B'长度;
程序点累积(A:数字数组;B:数字数组;R:输入输出数字)为
子类型公共_范围是数字_数组(1..A'长度);
Ax:地址=>A'地址的公共_范围;
Bx:地址=>B'地址的公共_范围;
开始
对于公共_Range'Range循环中的I
R:=R+Ax(I)*Bx(I);
端环;
结束;

确保A和B具有相同的长度,因此无需传递N参数。我认为这不会降低性能,因为Ax使用的内存与A相同。

这是另一种选择:

procedure Dot_累计(A:Number_数组;B:Number_数组;R:in-out Number)
Pre=>A'长度=B'长度;
程序点累积(A:数字数组;B:数字数组;R:输入输出数字)为
子类型公共_范围是数字_数组(1..A'长度);
Ax:地址=>A'地址的公共_范围;
Bx:地址=>B'地址的公共_范围;
开始
对于公共_Range'Range循环中的I
R:=R+Ax(I)*Bx(I);
端环;
结束;

确保A和B具有相同的长度,因此无需传递N参数。我认为这不会降低性能,因为Ax使用的内存与A相同。

这是另一种选择:

procedure Dot_累计(A:Number_数组;B:Number_数组;R:in-out Number)
Pre=>A'长度=B'长度;
程序点累积(A:数字数组;B:数字数组;R:输入输出数字)为
子类型公共_范围是数字_数组(1..A'长度);
Ax:地址=>A'地址的公共_范围;
Bx:地址=>B'地址的公共_范围;
开始
对于公共_Range'Range循环中的I
R:=R+Ax(I)*Bx(I);
端环;
结束;

确保A和B具有相同的长度,因此无需传递N参数。我认为这不会降低性能,因为Ax使用的内存与A相同。

从语言角度看,这是一条出路。不需要传递额外的参数N:信息已经在数组中。还可能更快,因为编译器可以省略索引范围检查;毕竟,索引保证在数组的边界内。约束数组类型还约束适用于任何维度的点积。对于无约束数组类型有什么解决方案吗?@PeterSchneider在数组A或B的长度不同的情况下,N参数存在。点积是可交换的,所以如果我交换A和B,应该没有结果。。。我错过什么了吗?只有一个N,那么如何使用它来传达不同的长度呢?对于点乘,长度不是必须相等吗