#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; гораздо логичнее, чем статус-кво в других языках программирования.