Практика программирования (Бейсик, Си, Паскаль)



Массивы в качестве параметров процедур и функций


Программисты, работавшие на Фортране, с грустью вспоминают времена, когда передача массива любой размерности в подпрограмму или функцию никаких забот не вызывала. Достаточно было написать нечто похожее на:

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, объявляющему все переменные внутри подпрограммы целочисленными.




Содержание  Назад  Вперед