Ада инициализирует массив на основе пользовательского ввода
Я перехожу с Java/C++ на Ada, и мне трудно разобраться с мелочами. Можно ли объявить массив и спросить пользователя о минимальных / максимальных значениях, а затем инициализировать его? Мне не нравится определять постоянные значения для MIN и MAX, и кажется, что должен быть способ сделать это.
Вы можете определить неограниченный тип, но вам все равно придется инициализировать размер в блоке объявления перед запуском вашей программы. Нужно ли иметь тело пакета, затем объявление процедуры, а затем блок объявления внутри процедуры, которая фактически выполняет работу, как показано ниже?
PACKAGE BODY Build_Graph IS
TYPE Graph_Box IS ARRAY(Integer RANGE <>, Integer RANGE <>) of Character;
PROCEDURE Print_Graph(Min, Max, Height, Width: IN Integer) IS
BEGIN
DECLARE
Graph: Graph_Box(0..Height, 0..Width);
BEGIN
Do_Stuf(Graph);
END;
END Print_Graph;
END Build_Graph;
1 ответ
То, что вы показываете там, должно работать. Тем не менее, блок "объявления" совершенно не нужен, если только вы не хотите перехватывать исключения диапазона в объявлении переменной массива или что-то в этом роде. Я бы изменил это, чтобы прочитать:
procedure Print_Graph(Min, Max, Height, Width: in Integer) is
Graph: Graph_Box(0..Height, 0..Width);
begin
Do_Stuf(Graph);
end Print_Graph;
(Мне также не нравится иметь зарезервированные слова в заглавных буквах.)
Еще одна вещь, которую я должен упомянуть: массивы Ada не должны быть основаны на 0, как в cish языках. Они могут быть, но вы также можете заставить их начинаться с 1, или -200, или как хотите.
Причина, по которой я привел это, заключается в том, что я вижу, как вы определили Graph_Box, он на самом деле имеет высоту +1 высоту и ширину +1 ширину. Вы, вероятно, не хотите этого, так как это может запутать кого-то позже (возможно, даже вас).
Моя типичная идиома - начинать индексы массива с 1, если у меня нет веских причин не делать этого.