Передача многомерных массивов в функцию



 

При передаче многомерных массивов в функцию все размерности должны передаваться в качестве параметров. По определению многомерные массивы в C и С++ не существуют. Если мы описываем массив с несколькими индексами, например, массив int mas[3][4], то это означает, что мы описали одномерный массив mas, элементами которого являются указатели на одномерные массивы int[4].

Рассмотрим функцию, которая решает задачу транспонирования квадратной матрицы (поворот матрицы на 90 градусов). Если определить заголовок функции как:

void transp(int a[][],int n){….},

то получится, что мы хотим передать массив с неизвестными размерами. По определению, массив должен быть одномерным и его элементы должны иметь одинаковую длину. При передаче массива о размере элементов ничего не сказано, поэтому компилятор выдаст ошибку.

Самый простой вариант решения этой проблемы, определить функцию следующим образом:

 

//Транспонирование квадратной матрицы

#include<iostream.h>

/*глобальная переменная, задает количество строк и столбцов в матрице*/

const int N=10;   

void transp(int a[][N],int n)

{

int r;

for(int I=0;I<n;I++)

for(int j=0;j<n;j++)

if(I<j)

{

r=a[I][j];

a[I][j]=a[j][I];

a[j][I]=r;

}

}

 

void main()

{

int mas[N][N];

for(int I=0;I<N;I++)

for(int j=0;j<Nlj++)

cin>>mas[I][j];

for(I=0;I<N;I++)

{

for(j=0;j<N;j++)

cout<<mas[I][j]

cout<<”\n”;

}

transp(N,mas);

for(I=0;I<N;I++)

{

for(j=0;j<N;j++)

cout<<mas[I][j]

cout<<”\n”;

}

}

Также при передаче многомерных массивов можно интерпретировать их как одномерные и внутри функции пересчитывать индексы (рис.9 )

//передача матрицы как одномерного массива

#include <iosream.h>

//передаем указатель на первый элемент матрицы

void form_matr(int *matr, int n)

{

for (int i=0;i<n; int n)

for( int j=0;j<n;j++)

matr[i*n+j]=rand()%10;//пересчитываем индекс элемента

}

void print_matr(int *matr, int n)

{

for (int i=0;i<n; int n)

{

for( int j=0;j<n;j++)

cout<<matr[i*n+j]<<” “;

cout<<”\n”;

}

}

void main()

{

int matr[5][5];

 /*передаем адрес первого элемента матрицы как фактический параметр*/

form_matr (&matr[0][0],5);

print_matr (&matr[0][0],5);

}

 

 

Вызов такой функции можно записать еще и следующим образом:

//выполняем приведение типов

form_matr ((int*)matr,5);

print_matr ((int*)matr,5);

 

 


 

                                       

Рис. 9 Размещение двумерного массива в памяти

 

Функции с начальными значениями параметров (по-умолчанию)

 

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

 

void print(char* name=”Номер дома: ”, int value=1)

{

cout<<”\n”<<name<<value;

}

 

Вызовы:

1. print();

Вывод: Номер дома: 1

2. print(”Номер квартиры”,15);

Вывод: Номер квартиры: 15

3. print(,15); - ошибка, т. к. параметры можно опускать только с конца.

Поэтому функцию лучше переписать так:

 

void print(int value=1, char* name=”Номер дома: ”)

{

cout<<”\n”<<name<<value;

}

 

Вызовы:

1. print();

Вывод: Номер дома: 1

2. print(15);

Вывод: Номер дома: 15

3. print(6, “Размерность пространства”);

Вывод: Размерность пространства: 6

Подставляемые (inline) функции

 

Некоторые функции в С++ можно определить с использованием служебного слова inline. Такая функция называется подставляемой или встраиваемой.

 

/* функция возвращает расстояние от точки с координатами (x1,y1) (по умолчанию центр координат) до точки с координатами (x2,y2)*/

inline float Line(float x1,float y1,float x2=0,float y2=0)

{

return sqrt(pow(x1-x2)+pow(y1-y2,2));

}

 

Обрабатывая каждый вызов подставляемой функции, компилятор пытается подставить в текст программы код операторов ее тела. Спецификатор inline определяет для функции так называемое внутреннее связывание, которое заключается в том, что компилятор вместо вызова функции подставляет команды ее кода. При этом может увеличиваться размер программы, но исключаются затраты на передачу управления к вызываемой функции и возврата из нее. Подставляемые функции используют, если тело функции состоит из нескольких операторов.

Подставляемыми не могут быть:

· рекурсивные функции;

· функции, у которых вызов размещается до ее определения;

· функции, которые вызываются более одного раза в выражении;

· функции, содержащие циклы, переключатели и операторы переходов;

· функции, которые имеют слишком большой размер, чтобы сделать подстановку.

 


Дата добавления: 2018-04-04; просмотров: 170;