【问题标题】:Ada dynamic array allocation index rangeAda 动态数组分配索引范围
【发布时间】:2015-06-26 23:07:01
【问题描述】:

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

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

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

就目前而言,第一个索引 'First 的计算结果为 -2147483648(可能类似于 0x80000000)。

是否可以按照我的要求进行操作?

这是 GNAT 上的 Ada83。

【问题讨论】:

    标签: ada


    【解决方案1】:

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

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

    如果您将索引类型从Integer 更改为Positive(这是Integer 的子类型,下限为1),则默认下限将为1

    一般来说,如果你定义一个数组变量指定它的初始值,但不指定下限,那么下限会默认为索引类型的下限。

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

    【讨论】:

      【解决方案2】:

      假设(如 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;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多