Раздел 8.4 - Передача строк между подпрограммами

Строки, так же, как и переменные других типов, можно передавать между подпрограммами. Переменная типа String может быть использована в качестве параметра вида in (или in out) процедуры или функции; значения параметров устанавливаются во время вызова подпрограммы. Кроме того, функции могут возвращать значение типа String, точно так же, как и любого другого.

При написании подпрограмм, принимающих строковые параметры, начинающие программисты на Аде часто необоснованно полагают, что индексы в строках всегда начинаются с единицы. Это неверно. Индексы в строках не обязательно начинаются с единицы - это всего лишь наименьшее возможное значение начального индекса. В частности, если в подпрограмму передать подстроку как входной параметр, то вызываемой подпрограмме будут переданы также значения индексов этой подстроки. Это делает работу со строками более эффективной, хотя и может показаться непривычным.

Наименьшее значение индекса строковой переменной с именем 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?

  1. S="test", S'First=3, S'Length=4
  2. S="test", S'First=1, S'Length=4

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 8

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s8s4.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org