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