8.5. ПАРАМЕТРИЗАЦИЯ
427
несколько снизит эффективность программы, но стоит ли жертвовать надеж-
ностью ради сокращения программы на одну-две команды?
Другая связь процедуры
MyOwnInpMatr
с глобальным контекстом — упо-
требление (глобальной) переменной
Matr
. Как и с переменной
N
, явное упо-
минание среди параметров имени массива, получение значения которого есть
основная цель процедуры, могло бы увеличить надежность программы. Од-
нако если обсуждаемая процедура предназначена для ввода только одной ма-
трицы, то имя ее массива становится элементом системы понятий, с кото-
рыми оперирует использующая программа. Тогда предположение о том, что
можно “забыть” имя обрабатываемой матрицы в подпрограмме ввода ее зна-
чений становится умозрительным. Вывод: включение имени массива, пред-
ставляющего матрицу в программе, в список параметров процедуры нецеле-
сообразно. Вместе с тем, если процедура используется для ввода нескольких
матриц, то употребление имени представляющего массива как out-параме-
тра разумно для реализации данной возможности. Для языка
С/С++
вопрос
о том, каким механизмом параметризации воспользоваться, не стоит: массив
здесь это просто область памяти, адрес которой есть значение переменной,
описанной как массив (т. е. такой, описание которой содержит квадратные
скобки). Иными словами, язык предписывает считать имена массивов ука-
зателями на них, а потому передача такого имени функции в качестве аргу-
мента по значению дает доступ к указываемой памяти: получается так, что
массив (как область памяти) передается по ссылке (с соответствующим мо-
делированием эффекта выходного параметра). Перенося эти рассуждения на
паскалеподобный язык, становится понятной причина, по которой
Matr
надо
передавать как переменную (т. е. по ссылке).
У процедуры
MyOwnInpMatr
есть еще одна, неявная связь с глобальным
контекстом.Это условие корректной ее работы:размерность матрицы не долж-
на превосходить значения константы
NN
. С точки зрения надежности про-
граммирования неявные связи подпрограмм с контекстом их погружения не-
желательны. В примере процедура
MyOwnInpMatr
не совсем надежна, т. к.
ее можно вызвать с нарушением условия корректности, а ошибка, к которой
приведет такой вызов, не будет своевременно диагностирована.
В языке
Pascal
есть средство для смягчения последствий такой ненадеж-
ности: возможность контроля значения переменной
N
за счет придания ей
типа
0..NN
(в глобальном контексте). Тем самым при наличии связи процеду-
ры с глобальным контекстом через эту переменную будет контролироваться
именно та величина, которая вызывает ошибку размерности. В случае проце-
дуры с параметром-размерностью этот параметр должен получить тип
0..NN