Ada 函数可以返回数组吗?

Jac*_*eed 3 arrays function ada

我在某处读到 Ada 允许一个函数只返回一个项目。由于数组可以包含多个项目,这是否意味着我可以返回整个数组还是必须只返回数组的单个索引?

Bri*_*ond 5

是的,Ada 函数可以返回数组或记录。

不过,使用它可能有诀窍。例如,如果您将返回值分配给一个变量,则该变量的大小必须恰好适合保存数组,并且有两种常见的方法可以实现这一点。

1)固定大小的数组 - 最干净的方法是定义一个数组类型,例如

type Vector is new Array(1..3) of Integer;

function Unit_Vector return Vector;

A : Vector;
begin
   A := Unit_Vector;
...
Run Code Online (Sandbox Code Playgroud)

2) 不受约束的数组变量。

这些是数组,其大小在运行时由初始分配决定。除非新值恰好与旧值具有相同的大小,否则对它们的后续分配将失败。诀窍是使用一个声明块——一个新的范围——这样对无约束变量的每次赋值都是它的第一次赋值。例如:

for i in 1 .. last_file loop
   declare
      text : String := Read_File(Filename(i));
      -- the size of "text" is determined by the file contents
   begin
      --   process the text here. 
      for j in text'range loop
         if text(j) = '*' then 
         ...
      end loop;
   end
end loop;
Run Code Online (Sandbox Code Playgroud)

一个警告:如果数组大小为数十兆字节或更多,则可能无法在堆栈上成功分配。因此,如果此构造引发 Storage_Error 异常,并且您无法提高堆栈大小,则可能需要使用访问类型、通过“new”进行的堆分配以及根据需要解除分配。