Программисты, работавшие на Фортране, с грустью вспоминают времена, когда передача массива любой размерности в подпрограмму или функцию никаких забот не вызывала. Достаточно было написать нечто похожее на:
SUBROUTINE MATMULT(A,B,C,N)
REAL A(N,N),B(N,N),C(N,N),D
DO 1 J=1,N
DO 1 K=1,N D=0
DO 2 L=1,N
2 D=D+A(J,L)*B(L,K)
1 C(J,K)=D
END
И дальше работать с элементами массивов, ни о чем не задумываясь. Подпрограмма такого вида позволяет перемножать квадратные матрицы любого размера.
Массивы-параметры в подпрограммах и функциях QBasic
Ближе всего к идеологии Фортрана оказался QBasic. В нем довольно похожим образом можно передать массив в подпрограмму или функцию. Продемонстрируем эту возможность на примере подпрограммы сложения целочисленных квадратных матриц:
Программа 4_01.bas
DECLARE SUB ADDMAT(A%(),B%(),C%(),N%) DEFINT A-Z CLS
DIM A1(2,2), A2(2,2),A3{2,2)
DIM Bl(3,3),B2(3,3),B3(3,3)
FOR J=0 TO 2 : FOR K=0 TO 2
A1(J,K)=J+K : A2(J,K)=J*K
NEXT К : NEXT J
CALL ADDMAT(Al(),A2(),A3() ,2) 'Так можно обратиться к подпрограмме
FOR J=0 TO 3 : FOR K=0 TO 3 B1(J,K)=J+K :
B2(J,K)=J*K
NEXT К : NEXT J
ADDMAT Bl(),B2(),B3(),3 'И так можно обратиться к подпрограмме END
SUB ADDMAT (A%(),В%(),С%(),N%)
DEFINT A-Z
FOR Q=0 TO N : FOR S=0 ТО N
C(Q,S)=A(Q,S)+B(Q,S)
NEXT S : NEXT Q
END SUB
Как в заголовке подпрограммы, так и в операторах обращения к ней массив-параметр сопровождается пустыми круглыми скобками, независимо от числа индексов, приписанных фактически передаваемым массивам. Никаких переобъявлений типа DIM A(N,N) в теле подпрограммы не нужно. Более того, попытка вставить такой оператор приведет к фиксации ошибки, сопровождаемой сообщением о повторном объявлении массива. Обратите внимание на то, что в заголовке подпрограммы использованы имена А%, B%, C%, N%, а в тексте подпрограммы вместо них выступают имена А, в, с, N. Своей эквивалентностью они обязаны оператору DEFINT A-Z, объявляющему все переменные внутри подпрограммы целочисленными.