Ada 动态数组分配索引范围
如何更改此代码以强制索引从第一个索引“first evaluating to 1”和最后一个索引“last evaluating to Length”开始Ada 动态数组分配索引范围,ada,Ada,如何更改此代码以强制索引从第一个索引“first evaluating to 1”和最后一个索引“last evaluating to Length”开始 Menu_Text_Ptr := new Packed_Message_Array_Type'("A...", "B...", "C..."
Menu_Text_Ptr := new Packed_Message_Array_Type'("A...",
"B...",
"C...",
"D...");
我有几个这样的动态数组,它们的长度各不相同。我不希望给出最后一个索引值的显式长度,因为这会使代码维护更加复杂。我宁愿从分配语句中添加或减去内容,然后让编译器计算出来
现在,第一个索引“first”的计算结果为-2147483648(可能类似于0x8000000)
能按我的要求做吗
这是GNAT上的Ada83。如果您的第一个索引是-2147483648(-231),那么您可能已经将数组类型定义为如下类型:
type Packed_Message_Array_Type is array(Integer range <>) of Some_Type;
type Packed_Message_Array_type是某种_类型的数组(整数范围);
如果将索引类型从Integer
更改为Positive
(它是Integer
的子类型,下限为1),则默认下限为1
通常,如果定义的数组变量指定其初始值,但未指定下限,则下限将默认为索引类型的下限
(我已经删除了这个答案的一部分;我认为您可以只为第一个元素定义索引,但位置关联不能跟在命名关联之后。)假设(正如Keith所做的那样)您有这样一个类型:
type Packed_Message_Array_Type is array(Integer range <>) of Some_Type;
或者,如果您不想硬编码上限:
declare
Source_Array : constant Packed_Message_Array_Type :=
("A...", "B...", "C...", "D...");
subtype Array_Subtype is Packed_Message_Array_Type(1..Source_Array'Length);
begin
Menu_Text_Ptr := new Array_Subtype'(Source_Array);
end;
我还没有测试过这两种方法,尤其是我不确定第二种方法是否有效。(另外,第二种方法更可能使用额外的时间在堆栈上创建数组并将其复制到分配的存储中,这取决于编译器的优化程度。)
declare
Source_Array : constant Packed_Message_Array_Type :=
("A...", "B...", "C...", "D...");
subtype Array_Subtype is Packed_Message_Array_Type(1..Source_Array'Length);
begin
Menu_Text_Ptr := new Array_Subtype'(Source_Array);
end;