我有一个传递给函数的字符串,我想比较字符串的第一个字符和数字。
I.E.
if String(1) = "3" then
当我编译时,我得到:
warning: index for String may assume lower bound of 1
warning: suggested replacement String'First + 1
我真的很想做到这一点,但是当我尝试“先”时,它实际上抓住了一个数字,而不是角色。
有更好的方法吗?
我尝试查找'第一个概念,以下网站解释说我实际上得到的是索引号,而不是实际内容:http://en.wikibooks.org/wiki/Ada_Programming/Types/array
例如,
Hello_World : constant String := "Hello World!";
World : constant String := Hello_World (7 .. 11);
Empty_String : constant String := "";
使用'首先我会得到:
Array 'First 'Last 'Length 'Range
Hello_World 1 12 12 1 .. 12
World 7 11 5 7 .. 11
Empty_String 1 0 0 1 .. 0
根据这些信息,我无法从Hello世界获得H(如果Hello_World(1)=“H”则进行比较)
编辑: 所以我最初这样做的方式是 (在这种情况下插入一些变量名而不是字符串)
String(String'First .. String'First) = "1"
然而,根据我所知道的,而不是写下所有这些,我发现了
String(String'First) = '1'
同样的事情,但使用字符比较,这更有意义!
感谢大家的所有答案!
答案 0 :(得分:3)
字符串是新手Ada编码员的最大障碍;对于那些已经专业处理Cish语言字符串的人来说尤其如此。
Ada字符串(实际上所有Ada数组)不像C一样基于0,或者像Fortran一样基于1。然而,他们是基于编码器的感觉。如果有人想要将他们的字符串从10 ... 200索引,他们就可以。因此,访问Ada字符串中的字符最安全的方法是使用'first
属性(或者更好,使用'range
或'first .. 'last
循环遍历它们。)
在您的情况下,您似乎只想获得字符串中的第一个字符。对名为X
的字符串执行此操作的最简单,最安全的方法是X(X'first)
。
在实践中,你几乎不会这样做。相反,你会循环遍历字符串的'first...'last
寻找某些东西,或只是使用Ada.Strings.Fixed
中的一个例程。
答案 1 :(得分:2)
警告建议您使用:
String(String'First + Index)
而不仅仅是
String(Index)
答案 2 :(得分:1)
你的问题中的代码有些奇怪。首先,你要调用你的变量“String”,它的类型是“String”。阿达将不会吵醒。
您为该代码片段重现的警告语句没有意义。
假设您的变量实际上称为“值”,即:
Value : String := "34543";
Value(1)与Value(Value'First + 1)不同,因为Value'First(在此声明中)为1 。所以你最终引用了Value(1 + 1)。您似乎遇到了这种情况,因为提到您无法在“Hello World”字符串中引用“H”。
现在警告是有效的,因为你使用'First(以及'Last和'Range)来引用数组边界更安全。但是如果要从通过'检索的边界偏移',则需要使用正确的索引。首先,通常使用0或基于1(在这种情况下,您需要偏移1)。使用在您的上下文中更合适和可读的基础。