Доступ к первому элементу строки в Аде - PullRequest
1 голос
/ 22 декабря 2010

У меня есть строка, переданная в функцию, я хотел бы сравнить первый символ строки с числом.

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

На основании этой информации я не могу получить Hиз Hello world (для сравнения, например, если Hello_World (1) = "H" тогда)

РЕДАКТИРОВАТЬ: Так, как я изначально делал это было (вставить имя переменной вместо строки в этом случае)

String(String'First .. String'First) = "1"

Так что это работает из того, что я могу сказать, однако, вместо того, чтобы писать все это, я обнаружил, что

String(String'First) = '1'

делает то же самое, но используя сравнение символов, что делает многоебольше смысла!

Спасибо за ответы всем!

Ответы [ 3 ]

3 голосов
/ 22 декабря 2010

Строки являются самым большим багабу для начинающих кодеров Ada; особенно для тех, кто уже является экспертом по работе со строками на языках Cish.

Строки Ada (фактически все массивы Ada) не основаны на 0, как C, или на 1, как Fortran. Они основаны, однако кодер чувствовал, что это так. Если кто-то хочет индексировать свою строку из 10 ... 200, он может. Так что действительно самый безопасный способ доступа к символам в строке Ada - это использовать атрибут 'first (или еще лучше, проходить по ним, используя 'range или 'first .. 'last).

В вашем случае похоже, что вы хотите получить только первый символ в строке. Самый простой и безопасный способ сделать это для строки с именем X - X(X'first).

В пактике вы бы почти никогда этого не сделали. Вместо этого вы будете перебирать строку 'first...'last в поисках чего-либо или просто использовать одну из подпрограмм в Ada.Strings.Fixed.

2 голосов
/ 22 декабря 2010

В предупреждении предлагается использовать:

String(String'First + Index)

Вместо

String(Index)
1 голос
/ 22 декабря 2010

В вашем вопросе есть что-то странное в коде.Во-первых, вы называете свою переменную «String» и что она имеет тип «String».Ада сразу же откажется от этого.

И предупреждения, которые вы воспроизводите для этого фрагмента кода, не имеют смысла.

Допустим, ваша переменная на самом деле называется «Значение», т.е.:

Value : String := "34543";

Значение (1) не совпадает со значением (Value'First + 1), поскольку Value'First (в этом объявлении) равно 1 .Таким образом, вы в конечном итоге ссылки на значение (1 + 1).Вы, кажется, испытываете это из-за упоминания о том, что вы не можете ссылаться на «H» в строке «Hello World».

Теперь предупреждение действительно, поскольку вы безопаснее, используя «First (и'Last and' Range) для ссылки на границы массива.Но вам нужно использовать правильное индексирование, если вы собираетесь смещаться от границы, полученной через 'First, обычно с использованием 0 или 1 (в этом случае вам нужно сместить на 1).Используйте любое основание, более подходящее и читаемое в вашем контексте.

...