首页 文章

使用长度和大小参数声明固定长度字符串数组

提问于
浏览
0

我希望能够为GTK ComboBox声明一个固定长度字符串的常量数组 . 是否可以在ADA中使用两个参数?

此代码允许通过声明字符串来设置数组的大小 . 是否有可能以某种方式用参数替换规范中的常量?

一个简单的数组不允许判别 . 判别式记录不允许匿名数组 .

编辑:

我可以以某种方式声明与表单等效的类型:

type StringOfStrings(sringlength:positive; arraysize:positive)array(1..arraysize)of string(1..stringlength);

这种形式是不可能的,因为数组不能有判别式 .

要么

子类型SelectorString是字符串;

type SelectorStringArray(arraysize:positive; stringlength:positive)是记录stringarray:SelectorString的数组(1..arraysize)(1..stringlength);结束记录;

此表单是不可能的,因为记录不能具有匿名数组 .

回答:

以下作品,

包Selectors.Strings是

子类型ArrayIndex是正范围1..64; - ComboBox中的最大条目

子类型TextIndex是正范围1..32; - 最大入场时间

type SelectorStringArray是字符的数组(arrayindex range <>,textindex range <>);

function StringSelector(stringarray:SelectorStringArray)return ArrayIndex;

sel:SelectorStringArray:=(“aa”,“bb”,“cc”,“dd”);

结束选择器 . 字符串;

sel中的字符串必须都是相同的长度 .

谢谢,

老工程师

package Selectors.Strings is

    SelectorStringLength : constant := 2;

    subtype SelectorString is string( 1..SelectorStringLength );

    type    SelectorStringArray is array( positive range <> ) of SelectorString;

    subtype SelectorStringIndex is positive;

    function    StringSelector( stringarray : SelectorStringArray ) return SelectorStringIndex;

    selectarray : SelectorStringArray := ( "aa", "bb", "cc", "dd" );

end Selectors.Strings;

1 回答

  • 0

    我正在寻找,但您在上面的代码中没有任何匿名数组,并且您可以使用其组件为命名数组类型的判别式记录类型 . 所以我不确定你的陈述"A discriminant record does not permit an anonymous array"是指什么 .

    假设 selectarray 最多可以包含100个字符串:

    subtype Select_Array_Size is Integer range 0 .. 100;  
    
    type Selector_Strings (Size : Select_Array_Size := 0) is record
        Data : SelectorStringArray (1 .. Size);
    end record;
    
    procedure Set_Select_Array (Data : SelectorStringArray);
    
    selectarray : Selector_Strings;  -- will be initialized with Size=>0, 
                                     -- Data=>an array of length 0
    

    在身体里

    procedure Set_Select_Array (Data : SelectorStringArray) is
    begin
        selectarray := (Size => Data'Length, Data => Data);
    end Set_Select_Array;
    

    然后使用 selectarray.Data 而不是 selectarray 来访问数据 .

    您需要最大数组长度,因为某些编译器将为 Selector_StringsData 组件分配尽可能大的空间 .

    另一种选择是使 selectarray 成为数组类型的 access .

相关问题