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


           

когда надо передавать обе размерности.


Самый сложный случай - когда надо передавать обе размерности. Здесь "очевидное" решение просто непригодно:
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::Интернет-Университет Информационных Технологий - дистанционное образование
Содержание  Назад  Вперед