Ада инициализирует массив на основе пользовательского ввода

Я перехожу с 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;

person ravun    schedule 22.10.2009    source источник


Ответы (1)


То, что вы там показываете, должно работать. Однако блок «declare» совершенно необязателен, если только вы не хотите перехватывать исключения диапазона в объявлении переменной массива или что-то в этом роде. Я бы изменил его на следующее:

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 не должны быть нулевыми, как в языках cish. Они могут быть, но вы также можете сделать так, чтобы они начинались с 1, -200 или как хотите.

Причина, по которой я поднимаю это, заключается в том, что я вижу, как вы определили Graph_Box, на самом деле это высота + 1 элемент в высоту и ширина + 1 элемент в ширину. Вы, вероятно, этого не хотите, так как позже это может кого-то сбить с толку (возможно, даже вас).

Моя типичная идиома - начинать индексы массива с 1, если у меня нет веских причин не делать этого.

person T.E.D.    schedule 22.10.2009