#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);
Эти три варианта дизайна сочетаются, чтобы обеспечить некоторый интерес