Как добавить индекс в массив в Ada, например, добавить для массива в Java?

#ada

Вопрос:

Я хочу добавить индекс к целочисленному массиву во время цикла. Например, добавьте 3 в [1,2] и получите массив типа [1,2,3]. Я не знаю, как написать это в формате, и я не могу получить ответ в Интернете.

Ответ №1:

Вы можете использовать векторы, чтобы сделать что-то подобное, используя операторamp;. Вы можете получить доступ к отдельным элементам так же, как к массиву, хотя вы используете () вместо []. Или вы можете просто использовать цикл for и получить элемент напрямую.

См. Приведенный ниже пример:

 with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Vectors;

procedure jdoodle is

    -- Create the package for a vector of integers
    package Integer_Vectors is new Ada.Containers.Vectors(Positive,Integer);
    
    -- Using subtype to make just the Vector type visible
    subtype Vector is Integer_Vectors.Vector;
    
    -- Make all the primitive operations of Vector visible
    use all type Vector;
    
    -- Create a variable
    V : Vector;
begin
    
    -- Add an element to the vector in each iteration
    for i in 1..10 loop
        V := V amp; i;
    end loop;
    
    -- Show the results
    for Element of V loop
        Put_Line(Element'Image);
    end loop;

    -- Print the 2nd element of the array
    Put_Line(Integer'Image(V(2)));
    
end jdoodle;
 

Ответ №2:

Массивы Ada являются типами первого класса, даже если тип массива является анонимным. Таким образом, 2-мерный массив-это другой тип, чем 3-мерный массив. Кроме того, массивы не определяются прямым указанием количества элементов в измерении, как это делается в языках, производных от C.

Например, если вы определяете 2-мерный массив, такой как

 type array_2d is array (Integer range 0..1, Integer range 1..2);
 

Вы определили массив с первым диапазоном 0..1 и вторым диапазоном 1..2. Это будет квадратная матрица, содержащая 4 элемента.

Вы не можете просто добавить другое измерение к объекту типа array_2d, описанному выше. Такой массив должен быть другого типа.

Кроме того, нельзя изменить определение объекта массива после его создания.

Ответ №3:

Хорошо, так что, хотя это простой вопрос, он очень быстро проникает в интересные детали дизайна. Во-первых, массив «всегда знает свои границы»-этот элемент языкового дизайна глубоко влияет на использование языка: вместо того, чтобы передавать длину массива в качестве параметра и, возможно, выходить из синхронизации, как в C, вы просто передаете массив и позволяете «он знает свои границы» позаботиться об управлении.

Во-вторых, массив всегда имеет статическую длину, что означает, что он не может быть изменен после создания. Предостережение: Создание массива может быть выполнено в «динамической» настройке, например, при запросе пользовательского ввода.

В-третьих, если подтип не ограничен, он может иметь «переменную» длину. — Это означает, что вы можете иметь что-то вроде Type Integer_Vector is Array(Positive Range <>) of Integer и иметь параметры, которые работают с любым переданным значением размера (и возвращаемыми значениями, которые могут быть любого размера). Это, в свою очередь, означает, что ваше обращение с такими подтипами само по себе имеет тенденцию к более общему.

В-четвертых, все они применимы и совмещают так, чтобы большое «потребности» в динамично размера массивы не нужны … да, бывают случаи, когда это необходимо или когда это более удобно иметь один регулируемый объект; это что Ada.Containers.Vectors — адресов, но при отсутствии необходимости широкого динамического размера объекта вы можете использовать обработку для достижения ваших целей.

Рассмотрим следующий пример:

 Type Integer_Vector is Array(Positive range <>) of Integer;
Function Append( Input : Integer_Vector; Element : Integer ) return Integer_Vector is
  ( Input amp; Element );

X : Constant Integer_Vector:= (1,2);
Y : Integer_Vector renames Append(X, 3);
 

Эти три варианта дизайна сочетаются, чтобы обеспечить некоторый интерес