2009-10-22 2 views
1

Я прихожу из Java/C++ в Ada, и мне трудно разобраться в мелочах. Можно ли объявить массив и спросить пользователя о значениях min/max, а затем инициализировать его? Мне не нравится определять постоянные значения для MIN и MAX, и кажется, что должен быть способ сделать это.Ada инициализирует массив на основе ввода пользователем

Вы можете определить неограниченный тип, но вам все равно придется инициализировать размер блока объявления до начала вашей программы. Должен ли я иметь тело пакета, затем объявление процедуры, а затем блок объявления внутри процедуры, которая фактически выполняет работу, например следующее:

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; 

ответ

2

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

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

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

Смежные вопросы