Arrays 访问Ada中字符串的第一个元素
我将一个字符串传递到函数中,我想将字符串的第一个字符与一个数字进行比较Arrays 访问Ada中字符串的第一个元素,arrays,string,ada,Arrays,String,Ada,我将一个字符串传递到函数中,我想将字符串的第一个字符与一个数字进行比较 I.E. if String(1) = "3" then 当我编译时,我得到: warning: index for String may assume lower bound of 1 warning: suggested replacement String'First + 1 我真的很想纠正这个错误,但当我尝试“first”时,它实际上获取了一个数字,而不是字符 有更好的方法吗 我试着查找“第一个概念”,下面的
I.E.
if String(1) = "3" then
当我编译时,我得到:
warning: index for String may assume lower bound of 1
warning: suggested replacement String'First + 1
我真的很想纠正这个错误,但当我尝试“first”时,它实际上获取了一个数字,而不是字符
有更好的方法吗
我试着查找“第一个概念”,下面的网站解释说我实际上得到的是索引的编号,而不是实际的内容:
比如说,
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 world获得H(用于比较,比如Hello_world(1)=“H”)
编辑:
所以我最初的做法是
(在本例中插入一些变量名而不是字符串)
因此,从我所能说的情况来看,这是可行的,然而,我并没有写下所有这些,而是发现
String(String'First) = '1'
做同样的事情,但使用字符比较,这使更多的意义
谢谢大家的回答 警告建议您使用:
String(String'First + Index)
而不仅仅是
String(Index)
警告建议您使用:
String(String'First + Index)
而不仅仅是
String(Index)
你的问题中的代码有些奇怪。首先,您要调用变量“String”,并且它的类型是“String”。艾达会立即对此表示反对 您为该代码片段复制的警告语句没有意义 假设您的变量实际上被称为“值”,即: 值(1)与值(Value'First+1)不同,因为Value'First(在此声明中)是1。因此,最终将引用值(1+1)。您之所以会遇到这种情况,是因为您提到无法在“Hello World”字符串中引用“H”
现在警告是有效的,因为使用“First”(和“Last and”Range)引用数组边界更安全。但是,如果要先从“via”检索到的边界偏移,则需要使用适当的索引,通常使用0基或1基(在这种情况下,需要偏移1)。使用在您的上下文中更合适和可读的基础。您的问题中的代码有些奇怪。首先,您要调用变量“String”,并且它的类型是“String”。艾达会立即对此表示反对 您为该代码片段复制的警告语句没有意义 假设您的变量实际上被称为“值”,即: 值(1)与值(Value'First+1)不同,因为Value'First(在此声明中)是1。因此,最终将引用值(1+1)。您之所以会遇到这种情况,是因为您提到无法在“Hello World”字符串中引用“H”
现在警告是有效的,因为使用“First”(和“Last and”Range)引用数组边界更安全。但是,如果要先从“via”检索到的边界偏移,则需要使用适当的索引,通常使用0基或1基(在这种情况下,需要偏移1)。在你的上下文中使用更合适和可读的基础。字符串是新手Ada程序员最大的麻烦;对于那些已经是Cish语言字符串处理专家的人来说尤其如此 Ada字符串(实际上所有Ada数组)不像C那样基于0,也不像Fortran那样基于1。他们的基础上,但编码器觉得它。如果有人想从10索引他们的字符串。。。200,他们可以。因此,访问Ada字符串中的字符最安全的方法是使用
'first
属性(或者更好的是,使用'range
或'first..'last
循环它们)
在您的例子中,看起来您只想获取字符串中的第一个字符。对于名为X
的字符串,最简单、最安全的方法是X(X'first)
但在pactice中,你几乎永远不会这么做。相反,你会在字符串的
“first…”last
中循环寻找一些东西,或者只是使用Ada.Strings中的一个例程。Fixed
字符串是新的Ada程序员最大的麻烦;对于那些已经是Cish语言字符串处理专家的人来说尤其如此
Ada字符串(实际上所有Ada数组)不像C那样基于0,也不像Fortran那样基于1。他们的基础上,但编码器觉得它。如果有人想从10索引他们的字符串。。。200,他们可以。因此,访问Ada字符串中的字符最安全的方法是使用'first
属性(或者更好的是,使用'range
或'first..'last
循环它们)
在您的例子中,看起来您只想获取字符串中的第一个字符。对于名为X
的字符串,最简单、最安全的方法是X(X'first)
但在pactice中,你几乎永远不会这么做。相反,你可以在字符串的
'first…'last
中循环寻找一些东西,或者只是使用Ada.Strings.Fixed
中的一个例程。我刚刚与另一位工程师讨论了这一点,得到了几乎相同的答案。这似乎是它的建议,但这不起作用。见下面我的答案…同意。你真正想做的是先使用'first
而不是1
,我刚刚和另一位工程师讨论过这个问题,得到了几乎相同的答案。这似乎是它的建议,但这行不通。见下面我的答案…同意。在这里,您真正想做的是首先使用类似于”的内容,而不是1
Er。。。你知道,你不可能有一个标准的,带-200的字符串-10索引范围,因为无约束的正索引子类型。嗯,至少你不能用它做任何有意义的事情:-)嗯。在我看来,我早在古代就看到过,但为了安全起见,我会修正我的答案,使用正数。(也许是一个