所以,我是第一次在 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/