При написании подпрограмм, принимающих строковые параметры, начинающие программисты на Аде часто необоснованно полагают, что индексы в строках всегда начинаются с единицы. Это неверно. Индексы в строках не обязательно начинаются с единицы - это всего лишь наименьшее возможное значение начального индекса. В частности, если в подпрограмму передать подстроку как входной параметр, то вызываемой подпрограмме будут переданы также значения индексов этой подстроки. Это делает работу со строками более эффективной, хотя и может показаться непривычным.
Наименьшее значение индекса строковой переменной с именем A записывается как A'First. По аналогии, наибольшим значением индекса будет A'Last, а длиной строки - A'Length.
Приведем простое правило: всякий раз при написании подпрограммы, которая принимает строковую переменную вкачестве входного параметра, всегда используйте 'First, 'Last, и 'Length - и никогда не предполагайте, что индексы строк начинаются с единицы. Если попытаться обратиться по индексу, выходящему за допустимый диапазон, будет возбуждено исключение, однако лучше не допускать таких ошибок.
Ниже приведен пример, который, вероятно, сделает изложенное более понятным:
with Text_IO; use Text_IO; procedure String2 is procedure Print_Reverse( S : String ) is begin for I in reverse S'First .. S'Last loop Put(S(I)); end loop; end Print_Reverse; Demo : String := "A test"; begin Print_Reverse(Demo(3..Demo'Last)); end String2;
Какое из утверждений верно во время вызова Print_Reverse?
Перейти к предыдущему разделу | Перейти к следующему разделу | Вернуться к содержанию Урока 8 |
---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s8s4.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк