arrays - Ada 中的字符串数组

标签 arrays string ada

所以,我是第一次在 Ada 中编码,并且必须创建这个预先填充的字符串数组,所以我可以使用随机方法并每次调用不同的值。

poolOfWords: constant array(1..50) of string := ("gum","sin","for","cry","lug","bye","fly",
                "ugly", "each","from","work","talk","with","self", "pizza","thing","feign","friend",
                 "elbow","fault", "dirty","budget","spirit","quaint","maiden","escort","pickax",
                 "example","tension","quinine","kidney","replica","sleeper", "triangle","kangaroo",
                 "mahogany","sergeant","sequence","moustache","dangerous","scientist",
                 "different","quiescent", "magistrate","erroneously","loudspeaker",
                 "phytotoxic","matrimonial","parasympathomimetic","thigmotropism");
但是,当我尝试编译时,出现此错误:“数组声明中的元素类型不受约束”。
我在互联网上搜索了所有内容,但找不到解决方案。我什至尝试使用 unbounded_string,但效果不佳。当我预先填充整数、浮点数数组时,它工作正常,但是当涉及到字符串时,它就不起作用了。
有人可以帮助我并解释发生了什么以及如何解决吗?我真的不想声明数组,然后一一填充 50 个索引中的每一个。

最佳答案

您的问题源于 String in Ada 是一种不受约束的类型。粗略地说,这意味着您需要指定“某物”才能拥有可用的类型。在String的情况下您需要指定字符串长度,因为 String只是 Character 的数组.如果你说类似的话

 X : String;
编译器提示,因为它不知道 X 的长度并且它不知道要为 X 保留多少内存.你需要说类似的话
  X : String(1..6);
或类似的东西
  X : String := "foobar";
请注意,在第二种情况下,您不需要指定索引范围,因为编译器能够从您使用 6- Character 的事实中推断出来。要初始化的字符串 X .
这就解释了为什么声明一个只有 String 的数组是非法的。 .当你声明一个数组时,编译器需要知道每个条目的大小(所有条目必须共享相同的大小,这使得访问数组的随机条目非常有效)。如果你声明一个只有 String 的数组,编译器不知道要为每个条目分配多少内存,因为长度未指定。
请注意,这会起作用(免责声明:我现在手头没有 Ada 编译器,所以我无法检查代码)
subtype ZIP_Code is String (1..5);
type ZIP_Code_Array is array(Positive range <>) of ZIP_Code;
因为现在编译器知道 ZIP_Code_Array 的每个条目的大小(5 Character)。
但是,在您的情况下,字符串的大小各不相同。我可以看到两种可能的解决方案
  • 如果事先知道最大长度,您可以使用 subtype上面显示的方法并用空格填充字符串。这是否是合适的解决方案取决于您的上下文
  • 我通常使用的方法是创建一个数组 Unconstrained_String我初始化如下
    function "+"(X: String) return Unbounded_String
        renames To_Unbounded_String; 
    
    poolOfWords: constant array(1..50) of Unbounded_String := 
        (+"gum",
         +"sin",
         +"for",
          -- and so on...
        );
    

  • 请注意 renames定义一元 +作为 To_Unbounded_String 的别名.这只是语法糖,允许您编写 +"gum"而不是 To_Unbounded_String("gum") .有人对这种语法糖感到畏缩(我也不那么热衷),但在这种情况下,我认为这是值得的,因为它使代码“更轻”。一元的定义会很好+接近它的用途,只是为了清楚起见。
    使用 Unbounded_String 的替代方法是使用通用包Bounded_Strings并定义 poolOfWords作为 Bounded_String 的数组.一个 Bounded_String可以容纳可变长度的字符串,只要长度小于实例化 Bounded_Strings 时指定的边界即可包裹。为了来回转换String您可以使用相同的“重命名技巧”。
    我的个人喜好是 Unbounded_String ,除非我有一些特殊的原因迫使我使用 Bounded_String .

    关于arrays - Ada 中的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65705242/

    相关文章:

    C: 2D-Array 没有从一开始就打印出来

    java - 我应该如何使用正则表达式拆分我的字符串?

    c# - DllImport 编码错误

    java - 如果没有更改则跳过 DLL 编译

    javascript - 如何使用 JavaScript 解析值?

    javascript - 使用 json 字符串字段的 JSON 数组异常

    Python,在列表中的每个项目上 append 字符串

    ada - Ada 2012 中的自定义条件失败消息

    ada - 何时使用Pragma Pure/Preaaborate

    java - try catch null 和空数组