C
Если аргумент процедуры – массив, то используется механизм передачи по адресу. При этом в список аргументов включается имя массива, в вызываемую процедуру передается адрес первого элемента (с нулевыми индексами) и массив некопируется в локальную память функции. При описании float a[10][10] обращение вида: <имя_функции>(a) эквивалентно обращению: <имя_функции>(&a[0][0]). Следовательно, массивы-параметры занимают память, отводимую в вызывающей процедуре массивам-аргументам, поэтому в вызываемой процедуре допустимы описания вида floatb[], a[][10]; Длины всех измерений, кроме первого, надо задавать, чтобы правильно извлечь из памяти значения нужного элемента массива (см. формулу в параграфе "Распределение массивов"). Допустимо даже несоответствие размерностей аргумента и параметра.
Пример.
Аргументы Параметры
float a[5][5], b[36]; float a[ ], b[ ][6];
Пример. Вычислить: z=uТbu, где {ui]}, i=1...4; {bij]}, i,j=1...4.
/* Вычисление квадратичной формы */
void main(void){
float u[4], /* Входной вектор */
b[4][4], /* Входная матрица */
v[4], /* Вектор b*u */
z, /* Результат */
scalar(float u[ ], float v[ ]); /*Скалярное произведение векторов */
int i, j;
/* Умножение матрицы на вектор */
void matrix(floatb[ ][4], float u[ ], float v[ ]);
printf("Исходный вектор:\n");
for(i=0; i<4; i++){
scanf("%f", &u[ i ]);
}
printf("Исходная матрица:\n");
for(i=0; i<4; i++){
for(j=0; j<4; j++){
scanf("%f", &b[ i ][ j ]);
}
}
matrix(b, u, v );
z=scalar(v, u );
printf("\n\n\nКвадратичная форма равна %.5g\n", z);
}/* End main */
/* Умножение матрицы на вектор */
void matrix(float a[ ][4], float x[ ], float y[ ]){
int i, j;
for(i=0; i<4; i++){
for(y[ i ]=j=0; j<4; j++){
y[ i ] += a[ i ][ j ]*x[ j ];
}
}
}/* End matrix */
/* Скалярное произведение векторов */
float scalar(float x[ ], float y[ ]){
int i;
float z;
for(z=i=0; i<4; i++){
z+=x[ i ]*y[ i ];
}
return z;
}/* End scalar */
Basic
Массивы передаются также по адресу, поэтому изменение их в вызывающей процедуре затруднений не вызывает.
Дальнейший материал относится только к языкам Cи C++. В языке Basic подобных средств нет.