Ada动态数组分配索引范围

时间:2015-06-26 23:07:01

标签: ada

我如何更改此代码以强制索引从第一个索引开始'首先评估为1和最后一个索引'最后评估为'长度?

  Menu_Text_Ptr := new Packed_Message_Array_Type'("A...",
                                                  "B...",
                                                  "C...",
                                                  "D...");

我有几个像这样的动态数组,它们的长度各不相同。我宁愿不放置最后一个索引值的显式长度,因为这会使代码维护更复杂一些。我宁愿只是在分配语句中添加或减去内容,让编译器弄明白。

现在看来,第一个索引'First评估为-2147483648(可能是0x80000000)。

有可能做我要问的事吗?

这是关于GNAT的Ada83。

2 个答案:

答案 0 :(得分:5)

如果您的第一个索引是-2147483648(-2 31 ),那么您可能已将数组类型Packed_Message_Array_Type定义为:

type Packed_Message_Array_Type is array(Integer range <>) of Some_Type;

如果将索引类型从Integer更改为PositiveInteger的子类型,其下限为1),则默认下限为{{1 }}

通常,如果定义一个指定其初始值但未指定下限的数组变量,则下限将默认为索引类型的下限。

(我删除了部分答案;我认为你可以只为第一个元素定义索引,但位置关联不能遵循命名关联。)

答案 1 :(得分:0)

假设(正如Keith所做的那样)你有这样的类型:

type Packed_Message_Array_Type is array(Integer range <>) of Some_Type;

如果您不想指示每个阵列只有正索引,但您希望数组从1开始,您可以说

declare
    subtype Array_Subtype is Packed_Message_Array_Type(1..4);
begin
    Menu_Text_Ptr := new Array_Subtype'("A...",
                                        "B...",
                                        "C...",
                                        "D...");
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;

我还没有对这些中的任何一个进行测试,特别是我不确定第二个是否有效。 (另外,第二个更有可能使用额外的时间在堆栈上创建数组并将其复制到分配的存储,具体取决于编译器的优化程度。)