Ada函数能否创建类似Java ArrayList的嵌套数组并返回?
Ada嵌套不定长数组实现方案
你需要的嵌套可变长整数数组属于「不定长数组的不定长数组」结构,Ada中因为静态类型约束,不能直接嵌套不定长数组作为元素,需要通过访问类型或标准库容器包装实现,具体步骤如下:
基础实现(访问类型方案)
1. 类型定义
首先逐层定义需要的数组类型:
-- 定义内层不定长整数数组 type Indef_Int_Array is array (Positive range <>) of Integer; -- 定义内层数组的访问类型(解决不定长类型无法作为数组元素的编译限制) type Indef_Int_Array_Access is access Indef_Int_Array; -- 定义外层嵌套不定长数组,元素为内层数组的访问类型 type Nested_Int_Array is array (Positive range <>) of Indef_Int_Array_Access;
2. 编写返回目标结构的函数
直接构造你需要的[[],[3],[3,5],[2,3,5]]结构返回即可:
function Get_Target_Array return Nested_Int_Array is begin return Result : Nested_Int_Array := ( 1 => new Indef_Int_Array'(()), -- 空数组 2 => new Indef_Int_Array'((3)), 3 => new Indef_Int_Array'((3, 5)), 4 => new Indef_Int_Array'((2, 3, 5)) ); end Get_Target_Array;
3. 使用与注意事项
- 读取内层元素需要先解引用访问类型,例如获取第三个内层数组的第二个元素(值为5)的写法为:
Your_Array(3).all(2) - 访问类型申请的堆内存需要手动释放避免泄漏,可以通过
Ada.Unchecked_Deallocation定义释放工具:
procedure Free is new Ada.Unchecked_Deallocation (Indef_Int_Array, Indef_Int_Array_Access); -- 单个元素释放示例:Free(Your_Array(1));
简化实现(Ada 2012+ Indefinite_Holders方案)
如果不想手动管理内存,可以使用Ada 2012引入的Indefinite_Holders容器包装不定长类型,自动管理生命周期:
with Ada.Containers.Indefinite_Holders; procedure Nested_Array_Example is type Indef_Int_Array is array (Positive range <>) of Integer; -- 实例化不定长容器包 package Int_Array_Holders is new Ada.Containers.Indefinite_Holders (Indef_Int_Array); use Int_Array_Holders; type Nested_Int_Array is array (Positive range <>) of Holder; function Get_Target_Array return Nested_Int_Array is begin return ( 1 => To_Holder(()), 2 => To_Holder((3)), 3 => To_Holder((3, 5)), 4 => To_Holder((2, 3, 5)) ); end Get_Target_Array; -- 取值示例:Get_Target_Array(3).Element(2) 返回5 begin -- 业务逻辑 null; end Nested_Array_Example;
取值时直接调用Element方法即可,无需手动释放内存。
内容的提问来源于stack exchange,提问作者wang kom
相关产品推荐
相关产品推荐

