Массив l oop начиная с первого индекса в Аде? - PullRequest
1 голос
/ 06 апреля 2020

В Аде, как вы определяете oop по любому массиву по любому индексу, начиная с первого индекса? Под «любым массивом» мы подразумеваем пустые массивы и массивы, индекс которых также не является целым числом.

РЕДАКТИРОВАТЬ: если для обработки угловых случаев требуется начальное условное выражение, например: пустые массивы, это нормально.

РЕДАКТИРОВАТЬ: Указывается «любой индекс» вместо только второй.

Ответы [ 2 ]

6 голосов
/ 07 апреля 2020

Помните, что Ada 'для' l oop не содержит оператора приращения. Вместо этого он перебирает диапазон значений. Диапазон значений может быть полным набором индексов массива или может быть непрерывным подмножеством этого диапазона. Самый простой способ выполнить sh - это объявить неограниченный тип массива, а затем передать фрагмент массива, который вы хотите обработать.

procedure main is    
     type Days is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
     type Day_Counts is array(Days range <>) of Integer;
     function Total(Item : in Day_Counts) return Integer is
        Sum : Integer := 0;
     begin
        for Day in Item'Range loop
            Sum := Sum + Item(Day);
        end loop;
        return Sum;
     end Total;

     Weekly_Counts : DayCounts := (1,2,3,4,5,6,7);
     Weekly_Sum : Integer;
     Weekend_Sum : Integer;
  begin
    Weekly_Sum := Total(Weekly_Counts);
    Weekend_Sum := Total(Weekly_Counts(Sat..Sun));
  end main;

Значение, помещенное в Weekly_Sum, будет суммой всех 7 элементы массива. Значение, помещенное в Weekend_Sum, будет суммой только значений Sat и Sun.

4 голосов
/ 06 апреля 2020

В Ada вы можете указать, по каким индексам итерироваться:

-- Declarations
Start  : Index_Type;
Finish : Index_Type;
-- Usage
Start := -- Pick your start
Finish := -- Pick your end
for Index in Start .. Finish loop
   -- do your stuff
end loop;

-- Example
with Ada.Text_IO; use Ada.Text_IO;

procedure Test is

    type Index_Type is (Red, Blue, Green);
    type Array_Type is array(Index_Type range <>) of Integer;

    My_Array : Array_Type(Index_Type'Range) := (1,2,3);

    Start, Finish : Index_Type;

begin

    Start  := Blue;
    Finish := Green;

    for Index in Start .. Finish loop
       Put_Line(My_Array(Index)'Image); 
    end loop;

    Put_Line("Hello World");

end Test;

, где Start и End могут быть любым типом индекса, который вы хотите. Или вы можете просто перебрать все из них, если хотите, и позволить компилятору определить, какой из них является первым и последним.

Это работает для любого типа, который может быть индексом массива (Enumerations, Integers, et c.).

Для любого типа индекса вы можете делать такие вещи, как:

Index_Type'First
Index_Type'Last
Index_Type'Succ(value)
Index_Type'Pred(value)
My_Array'Length
My_Array'Range

среди многих других. Это должно позволить вам делать то, что вам нужно для математического анализа (опять же, независимо от типа индекса). См. Некоторые примеры ниже

for Index in My_Array'Range loop
   if Index /= My_Array'First then
      -- do stuff here
   end if;
end loop;

if My_Array'First /= Index_Type'Last then
   for Index in Index_Type'Succ(My_Array'First) .. My_Array'Last loop
      -- Do your stuff
   end loop;
end if;
...