Язык программирования C++ для профессионалов


Параметр-массив - часть 2


Самый сложный случай - когда надо передавать обе размерности. Здесь "очевидное" решение просто непригодно:

void print_mij(int m[][], int dim1, int dim2) // ошибка { for ( int i = 0; i<dim1; i++) { for ( int j = 0; j<dim2; j++) cout << ' ' << m[i][j]; cout << '\n'; } }

Во-первых, описание параметра m[][] недопустимо, поскольку для вычисления адреса элемента многомерного массива нужно знать вторую размерность. Во-вторых, выражение m[i][j] вычисляется как *(*(m+i)+j), а это, по всей видимости, не то, что имел в виду программист. Приведем правильное решение:

void print_mij(int** m, int dim1, int dim2) { for (int i = 0; i< dim1; i++) { for (int j = 0; j<dim2; j++) cout << ' ' << ((int*)m)[i*dim2+j]; // запутано cout << '\n'; } }

Выражение, используемое для выбора элемента матрицы, эквивалентно тому, которое создает для этой же цели транслятор, когда известна последняя размерность. Можно ввести дополнительную переменную, чтобы это выражение стало понятнее:

int* v = (int*)m; // ... v[i*dim2+j]

Лучше такие достаточно запутанные места в программе упрятывать. Можно определить тип многомерного массива с соответствующей операцией индексирования. Тогда пользователь может и не знать, как размещаются данные в массиве.

on_load_lecture()

Дальше »

  Если Вы заметили ошибку - сообщите нам.  

Страницы:

« |

1

|

2

|

3

|

4

|

5

|

6

|

7

|

8

|

9

|

вопросы | »

|

учебники

|

для печати и PDA


Курсы | Учебные программы | Учебники | Новости | Форум | Помощь



Телефон: +7 (495) 253-9312, 253-9313, факс: +7 (495) 253-9310, email: info@intuit.ru

© 2003-2007, INTUIT.ru::Интернет-Университет Информационных Технологий - дистанционное образование




Начало  Назад  Вперед



Книжный магазин