Ада,Струны.Исправлено.Индексировать неожиданные результаты в цикле

#ada #gnat

Вопрос:

У меня есть простая процедура, которая разбивает строку, а затем выполняет поиск подстрок внутри них. Я получаю странные результаты, но я не совсем понимаю, почему. Я подозреваю, что это может быть связано со стратегией оценки Ada или чем-то в этом роде.

 with Ada.Text_IO; use Ada.Text_IO; with Ada.Strings.Fixed; use Ada.Strings.Fixed; with GNAT.String_Split; use GNAT;  procedure Split_Test is  Subs : String_Split.Slice_Set; begin  String_Split.Create (Subs, "abcdSEPabcd", "SEP", String_Split.Multiple);   for Substring of Subs loop  declare  Idx : Integer := Index(Substring, "abc");  begin  Put_Line("index of abc is" amp; Integer'Image(Idx) amp; " within string " amp; Substring);  end;  end loop; end;   

Когда я запускаю его, я получаю:

 index of abc is 1 within string abcd index of abc is 8 within string abcd  

Очевидно, что индекс abc должен быть равен 1 на обеих итерациях. В чем здесь проблема?

Комментарии:

1. Здесь нет никаких проблем. Substring является фрагментом (копией) исходной строки (которая сама может быть фрагментом или иметь начальный индекс, отличный от 1)

2. Put_Line("Substring " amp; Substring amp; " starts at " amp; integer'image(Substring'First)); чтобы проиллюстрировать точку зрения Эгиля…

Ответ №1:

Ada позволяет индексировать строки, начиная с любого допустимого положительного значения. Что кажется, так это то, что функция разделения GNAT (Create) просто гарантирует, что подстроки используют те же индексы, что и их данные в исходной комбинированной строке. Что полезно для поиска исходного индекса значения, которое вы ищете.

Если вы хотите, чтобы ответ всегда был 1 для первого индекса, вам нужно будет сначала вычесть подстроку и добавить 1 к индексу, но, честно говоря, в этом не должно быть никакой необходимости. Просто убедитесь, что ваш код, обрабатывающий подстроку, всегда использует операции относительно подстроки ‘ First, и не будет иметь значения, каков первый индекс.

Комментарии:

1. Ada стремится улучшить ясность кода, задавая вопросы о причудах на других языках, которые стали общепринятой практикой, например, что N-е значение массивов индексируется N — 1-это распространенный источник ошибок, и поэтому обычный обычай Ada-индексировать, начиная с 1, и поэтому массивы, содержащие N значений, могут быть проиндексированы от 1 до N; гораздо логичнее, чем статус-кво в других языках программирования.