Можно ли объявить общую функцию как для ограниченных, так и для неограниченных массивов?

Скажем, у меня есть формальный тип массива и функция для поиска индекса данного элемента в этом массиве, например:

generic
   type T is private;
   type T_index is (<>);
   type T_array is array(T_index range <>) of T;
function FindIndexGeneric(array: T_array; element: T; elementFound: out Boolean) return T_index;

Создание экземпляра для неограниченного массива, такого как строка, отлично работает:

function FindIndexString is new FindIndexGeneric
  (T=>Character, T_index=>Positive, T_array=>String);

Но то же самое не работает, когда у меня есть ограниченный массив:

type userIDIndex is Integer range 1..6;
type userID is array(userIDIndex) of Character;
function FindIndexUserID is new FindIndexGeneric
  (T=>Character, T_index=>userIDIndex, T_array=>userID);
-- error: expect unconstrained array in instantiation of "T_array"

Я могу заставить массивы с ограничениями работать, изменив строку объявления формального массива на:

type T_array is array(T_index) of T;

Но тогда я не могу создавать неограниченные массивы с этим.

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

Есть ли способ заставить общую функцию работать как с ограниченными, так и с неограниченными массивами?

Ваша логика идет в ограниченном варианте. Неограниченная версия объявляет соответствующий ограниченный подтип, создает с ним экземпляр ограниченной версии и вызывает ограниченный экземпляр.

Jeffrey R. Carter 11.01.2023 11:35
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
2
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

generic
   type T is private;
   type T_index is (<>);
   type T_array is array (T_index range <>) of T;
...
type userIDIndex is Integer range 1..6;
type userIDUnconstrained is
   array (userIDIndex range <>) of Character;
subtype userID is userIDUnconstrained (userIDIndex);

function FindIndexUserID is new FindIndexGeneric
  (T       => Character,
   T_index => userIDIndex,
   T_array => userIDUnconstrained);

Затем вы можете вызвать FindIndexUserID с параметром ограниченного (под)типа userID. Однако обратите внимание, что в теле дженерика вы должны пройти по параметру массива, перебирая диапазон его индексов (arry'Range), а не весь T_index.

Другие вопросы по теме