|
|
  |
Передать произвольный многомерный массив по указателю в функцию, Очередная пятничная задачка |
|
|
|
May 8 2013, 19:04
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
На эту тему есть хорошее высказывание: "В языке С нет многомерных массивов, но есть массивы из одномерных массивов".  Ваша задача традиционно решается иным заданием исходного массива: Код // создаем массив массивов NxM: int i; float **matrix; matrix = (float**)malloc( N * sizeof(float*)); // создаем массив указателей на строки for( i=0; i < N; i++) matrix[i] = (float*)malloc( M * sizeof(float)); // аллокируем строки
// зовем функцию:
func( matrix, N, M); // заполняет матрицу NxM единичками
// удаляем массив:
for( i=0; i < N; i++) free( matrix[i]); // удаляем строки free( matrix); // удаляем указатель на них
.....
// сама функция определена так:
void func( float **matrix, int N, int M) { int i, j; for( i=0; i < N; i++) for( j=0; j < M; j++) matrix[i][j] = 1; // заполняем единичками } Заметим, что, несмотря на "вычурность" инициализации такой матрицы, она поддерживает традиционное обращение к своему элементу - matrix[i][j]. Кстати, этот случай как раз хорош для C++, т.к. в нем удобно создать класс для квадратных матриц, где их создание запихнуть в конструктор, а удаление в деструктор.
|
|
|
|
|
May 13 2013, 06:33
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (Xenia @ May 9 2013, 02:04)  Заметим, что, несмотря на "вычурность" инициализации такой матрицы, она поддерживает традиционное обращение к своему элементу - matrix[i][j]. Кстати, этот случай как раз хорош для C++, т.к. в нем удобно создать класс для квадратных матриц, где их создание запихнуть в конструктор, а удаление в деструктор. На плюсах как раз можно тут без всяких классов обойтись и решить задачу в исходном виде: CODE template <typename T, size_t N, size_t M> int m(T (& a)[N][M]) {
printf("N: %d, M: %d\n", N, M); return a[1][1]; // к примеру, элемент с индексами 1, 1 }
float matrix[5][6] = { ... };
int main() { printf("%f\n", m(matrix) ); return 0; }
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 13 2013, 08:10
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 4-08-05
Из: г. Саратов
Пользователь №: 7 351

|
Цитата(MrYuran @ May 13 2013, 11:35)  Осталось сделать то же самое, но статически. Если писать на Си и есть поддержка стандарта c99 (для GCC включаем -std=c99), то можно так CODE #include <stdio.h>
float matrix1[3][4] = { { 1.0f, 2.0f, 3.0f, 4.0f }, { 5.0f, 6.0f, 7.0f, 8.0f }, { 9.0f, 10.0f, 11.0f, 12.0f } };
float matrix2[4][2] = { { 1.0f, 2.0f }, { 3.0f, 4.0f }, { 5.0f, 6.0f }, { 7.0f, 8.0f } };
void matrix_out(int n, int m, float matrix[n][m]) { printf("Матрица[%d][%d]:\n", n, m); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) printf("\t%f", matrix[i][j]); putchar('\n'); } }
int main() { matrix_out(3, 4, matrix1); matrix_out(4, 2, matrix2); return 0; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|