Как я могу проверить, существует ли элемент массива в Аде - PullRequest
1 голос
/ 14 февраля 2011

Как проверить, существует ли элемент массива в Аде. Также есть какой-нибудь хороший документированный сайт для Ada, такой как сайты документации python или php, чтобы я мог искать все типы функций и их использование. Я не могу найти больше информации в Google для некоторых типов функций в Ada.

soldiers : array (0..max_number_of_soldiers - 1) of soldier_type;
procedure Next (Index: in out Integer; Interval: Positive) is
     begin
        for I in 1..Interval loop
           loop
             Index := (Index + 1) mod Number_Of_Soldiers;
             exit when Soldiers(Index).Alive;
           end loop;
        end loop;
     end Next;

Что показывает Солдат (Индекс). Живой? Что такое .alive?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

"Что показывает Солдат (Индекс). Живой? Что такое .alive?"

Точное определение типа soldier_type отсутствует, но, очевидно, у него есть (логическое) поле alive.

Есть массив max_number_of_soldiers солдат. Этот код перебирает массив и завершает работу, когда находит живого солдата.

Он начинается с индекса Index и проходит по элементам Interval. Если он достигает конца, он переносится и запускается в начале массива.

Итак, чтобы ответить на ваш вопрос, Солдаты (Индекс). Alive возвращает, жив ли припой в index или нет.

1 голос
/ 14 февраля 2011

Массивы в Ada могут быть объявлены с любыми границами, которые желает кодер, даже при вызове подпрограммы (возможно, при чтении нужного размера от пользователя во время выполнения). Границы могут быть получены кодером с использованием таких атрибутов, как 'first, 'last и 'length. По соглашению массивы в Аде обычно не используют значения-терминаторы.

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

В случае кода, который вы представили, похоже, что каждый элемент в этом массиве имеет допустимые значения soldier_type, что, очевидно, является типом записи с логическим полем с именем Alive. Кроме того факта, что он использует его для завершения цикла, я мало что могу рассказать вам об этом.

Хорошо, я полагаю, что могу сказать, что если ни у одной записи во всем этом массиве не установлен флаг Alive, то у вас бесконечный цикл. Это, вероятно, не то, что вы хотели бы случиться. Кроме того, если бы это был я, я бы сделал массив из 1..max_number_of_soldiers только потому, что он читается лучше. Либо есть гораздо больше кода, работающего с этим массивом, который выглядит лучше, когда он основан на 0, либо кто-то является программистом на Си и испытывает проблемы с отказом от старых привычек.

Для документации, я бы посоветовал посмотреть сайты, перечисленные в вики тэга Ada . Если у вас есть особый интерес к функциям, определяемым языком, и тому подобное, вы должны знать, что полное справочное руководство по языку доступно онлайн (в отличие от многих других языков, которые я мог бы назвать). Я бы настоятельно рекомендовал просмотреть приложения A (предопределенная языковая среда), K (языковые атрибуты) и L (языковые прагмы). К, в частности, следует прочитать внимательно.

...