ХОРОШО. Первый урок по Ada для опытных программистов Cish: параметры Ada отличаются от параметров Cish. В C (параметры предварительной ссылки) каждый отдельный параметр является эквивалентом параметра Ada 'in', с дополнительной оговоркой, что компилятор C всегда должен тупо передавать все это в стеке, независимо от того, насколько он огромен. Итак, вы, бедные программисты на C, вбили себе в голову, что вы никогда не передаете большие объекты в подпрограммы напрямую, а всегда используете указатели.
Ада другая. Вы сообщаете компилятору, как вы хотите получить доступ к своим параметрам (только чтение — «вход», только запись — «выход» или чтение и запись — «вход-выход»). Однако это не имеет ничего общего с тем, как передаются параметры. Механизм передачи параметров зависит от компилятора, и компилятор выберет наиболее эффективный способ сделать это. На практике почти на всех платформах это означает, что все, что слишком велико для регистра, будет передаваться по ссылке. Но это деталь реализации, и это дело компилятора, а не ваше. Вы даже не должны думать об этом, за исключением очень редких случаев.
Так что стисните зубы и передайте этот массив в чистом виде как параметр in out
. Поверьте, вам понравится.
type vector is array (natural range <>) of integer;
my_vec : vector(1..3);
procedure test (subject : in out vector) is
begin
...
end;
Ада спроектирована таким образом, чтобы ее можно было использовать почти во всех случаях без указателей, и ее можно было использовать во всех случаях, кроме очень немногих очень редких, без необходимости указателей на объекты, размещенные в стеке.
Первый довольно небезопасен (опасность из-за нераспределенных указателей и утечек памяти), а второй еще более небезопасен (объекты стека могут выйти за пределы области видимости раньше, чем ваш указатель, и даже если они этого не сделают, одна маленькая ошибка размера может повредить всю вашу память). программа). Вы по-прежнему можете делать и то, и другое на Аде, но, в отличие от многих языков, он предназначен для того, чтобы небезопасные вещи требовали немного больше работы с вашей стороны, а очень небезопасные вещи требовали написания основного PITA.
Например, если бы вы просто динамически выделяли весь массив, вам не пришлось бы возиться с этими aliased
и all
делами. Кроме того, если вы просто хотите передать массив в подпрограмму, вы можете просто передать его в качестве параметра, и вам даже не придется возиться с динамическим выделением и освобождением. Опять же, компиляторы Ады достаточно умны, чтобы передавать большие объекты по ссылке (да, даже если вы указали in
). Это требует корректировки отношения кодеров C/C++, которые привыкли говорить своему тупому компилятору, чтобы он не пропускал 10-мегабайтные объекты в стек. Вы должны научиться позволять компилятору Ada заботиться о том, как эффективно передать ваши параметры, и вы можете просто беспокоиться о том, как написать отличный код.
person
T.E.D.
schedule
23.09.2010