[C++] Передача матрицы в функцию |
Здравствуйте, гость ( Вход | Регистрация )
[C++] Передача матрицы в функцию |
3.06.2008 - 23:15
Вставить ник | Быстрая цитата | Сообщение
#1
|
|
Still loving you... Группа: Модератор Сообщений: 1389 Регистрация: 2.02.2004 Пользователь №: 2135 |
Всем доброй ночи.
Есть задача организовать наполнение нескольких разноразмерных двумерных массивов через некоторую функцию. Возник вопрос, каким образом можно передать двумерный массив в функцию в качестве параметра? Сам реализовывал данную задачу двумя способами - через указатели и через динамический массив, однако, преподаватель попросил реализовать это дело как-то под другому... Вот, сижу, ломаю голову В качестве примера выполнения данного задания, препод мне вручил вот такой код. Код #include <stdio.h> #include <stdlib.h> #include <time.h> int F[15][7], K[10][9], N[3][6]; void create_matrix(int x[][10], int a, int b) { for(int i=0; i<a; i++) { for (int j=0; j<b; j++) { x[i][j]=rand()%100; printf("%3d", x[i][j]); } printf("\n"); } printf("\n"); } void main() { printf("We have matrix F[15][7]\n\n"); create_matrix(F, 15, 7); printf("We have matrix K[10][9]\n\n"); create_matrix(K, 10, 9); printf("We have matrix N[3][6]\n\n"); create_matrix(N, 3, 6); } Код не рабочий. Никак не могу понять в чём фишка. |
|
|
3.06.2008 - 23:54
Вставить ник | Быстрая цитата | Сообщение
#2
|
|
Частый гость Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 |
Код не рабочий потому что не компилируется и выдает вот такую, например, ошибку:
Cannot convert 'int ( *)[7]' to 'int ( *)[10]' ? Надо ж наверное написать было, как именно он не работает, да? В общем, он и не должен работать, потому что для всех матриц с количеством столбцов, не равным 10, функция не сможет правильно обращаться к элементам матрицы. Потому что там (в памяти), где у матрицы [15][7] начинается вторая строка, у матрицы [][10] есть еще три элемента первой. Поэтому в функции create_matrix(...) - если бы она работала - запись значений в матрицу F вышла бы за пределы выделенной под неё памяти, что недопустимо. |
|
|
4.06.2008 - 00:09
Вставить ник | Быстрая цитата | Сообщение
#3
|
|
Still loving you... Группа: Модератор Сообщений: 1389 Регистрация: 2.02.2004 Пользователь №: 2135 |
Код не рабочий потому что не компилируется и выдает вот такую, например, ошибку: Cannot convert 'int ( *)[7]' to 'int ( *)[10]' Да, именно так. Собственно, я и сам понимаю по какой причине данный код не работает, но суть в другом. Существует ли вообще какой-нить другой простой способ передачи матрицы в функцию (без указателей)? Реализацию через указатели препод не принимает, и даёт в качестве образца реализации не рабочий код, который преведён выше. Прям не знаю, крыша чтоли поехала... |
|
|
4.06.2008 - 00:32
Вставить ник | Быстрая цитата | Сообщение
#4
|
|
Частый гость Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 |
Код void create_matrix(int x[], int a, int b) { for(int i=0; i<a; i++) { for (int j=0; j<b; j++) { x[i*b+j]=rand()%100; } } } (printf-ы не забудьте) Вызов: Код int F[10][10]; create_matrix(F[0],10,10); Примерно так. На самом деле, если вдуматься - здесь тоже применяется адрес (адрес первого элемента матрицы F), но поскольку звездочек нет, значит и явного применения указателей нет Сообщение отредактировано Graker - 4.06.2008 - 00:33 |
|
|
3.02.2009 - 20:05
Вставить ник | Быстрая цитата | Сообщение
#5
|
|
в вечном поиске Группа: Участник Сообщений: 8163 Регистрация: 24.11.2007 Пользователь №: 21977 |
А еще можно объявить матрицы глобальными и тогда - идите в пень ваще, товарищ преподаватель))
|
|
|
3.02.2009 - 20:47
Вставить ник | Быстрая цитата | Сообщение
#6
|
|
Частый гость Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 |
|
|
|
3.02.2009 - 20:53
Вставить ник | Быстрая цитата | Сообщение
#7
|
|
в вечном поиске Группа: Участник Сообщений: 8163 Регистрация: 24.11.2007 Пользователь №: 21977 |
Упс... А то не слышать) Просто я как-то привык, что на первой странице обычно свежие темы висят) А тут затишье такое, я на дату последнего поста не посмотрел) Сорри)
|
|
|
Текстовая версия | Сейчас: 25.04.2024 - 09:32 |