In / Out vs Out в Аде - PullRequest
       5

In / Out vs Out в Аде

5 голосов
/ 08 февраля 2012

У меня быстрый вопрос по Аде. Если у меня есть процедура, в которой я может записать в переменную, или я может оставить ее в покое, это должен быть параметр Out или In Out? Я думаю, это сводится к вопросу:

Что видит вызывающая сторона, если она вызывает процедуру с параметром Out, но процедура не касается параметра. Видит ли это то же значение? Неопределенное поведение?

Компилятор не жалуется, потому что видит присваивание переменной Out ... он просто оказывается в условном, где он не может быть достигнут, и компилятор не удосуживается проверить все пути .

Я подозреваю, что безопасная ставка помечает параметр как In Out, но я хотел бы знать, является ли это необходимым или просто стилистически предпочтительным.

Спасибо!

-prelic

1 Ответ

11 голосов
/ 08 февраля 2012

В Ada, когда процедура с параметром out ничего не записывает в этот параметр, результат, переданный обратно вызывающей стороне, представляет собой что-то undefined .Это означает, что все, что было в этой переменной в вызывающей программе, перезаписывается мусором при возврате из процедуры.

Лучшей практикой в ​​Ada является окончательная инициализация всех параметров out подходящим значением по умолчанию в начале.процедуры.Таким образом, любой путь кода из процедуры приводит к тому, что действительные данные передаются вызывающей стороне.

Если в вызывающей программе есть что-то, что может быть изменено процедурой, необходимо использоватьin out параметр.

Из Ada 95 RM 6.4.1 (15) :

Для любого другого типа формальный параметр неинициализирован.Если составной, выполняется преобразование представления фактического параметра в номинальный подтип формального (что может вызвать Constraint_Error), и фактический подтип формального является преобразованием представления.Если элементарный, фактический подтип формального определяется его номинальным подтипом.

...