Форум программистов, компьютерный форум CyberForum.ru

Двумерный массив в качестве параметра функции - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.67
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
01.05.2010, 21:30     Двумерный массив в качестве параметра функции #1
почему не удаётся передать в качестве параметра двумерный массив?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream.h>
 
int sum(const int** mas, const int l,const int m);
 
int const l = 2, m=4;
 
int main(){
 
    const int marks[l][m]={{1,2,-4,6},{0,5,-2,8}};
 
    cout<< sum(marks, l,m);
    return 0;
}
 
int sum(const int** mas, const int l,const int m) 
{int s = 0;
for (int i = 0 ; i<l; i++)
for (int j = 0 ; j<l; j++)
  s += mas[i][j];
 return s;}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.05.2010, 21:32     Двумерный массив в качестве параметра функции #2
Таким способом передаются динамические матрицы, то есть двойной указатель принимает адрес
первого указателя: на первую строку матрицы.
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
01.05.2010, 21:39  [ТС]     Двумерный массив в качестве параметра функции #3
а как тогда?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,427
01.05.2010, 22:01     Двумерный массив в качестве параметра функции #4
Цитата Сообщение от velodro Посмотреть сообщение
а как тогда?
Можно так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream.h>
 
int sum(const int* mas, const int l,const int m);
 
int const l = 2, m=4;
 
int main(){
 
        const int marks[l][m]={{1,2,-4,6},{0,5,-2,8}};
 
        cout<< sum(&marks[0][0], l,m);
        return 0;
}
 
int sum(const int* mas, const int l,const int m) 
{int s = 0;
for (int i = 0 ; i<l; i++)
for (int j = 0 ; j<l; j++)
  s += mas[l*i+j];
 return s;}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.05.2010, 23:08     Двумерный массив в качестве параметра функции #5
insideone, все бы хорошо, но попробуй в приведенную тобой функцию передать "динамическую" матрицу - результат будет плачевным.
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
01.05.2010, 23:37  [ТС]     Двумерный массив в качестве параметра функции #6
s += mas[l*i+j];
а вот это почему так?
и второе - почему в последнем варианте нельзя вот так: s += mas[i][j];
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.05.2010, 23:43     Двумерный массив в качестве параметра функции #7
velodro, если тебе необходимо использовать только "статическую" матрицу то вот:
C++
1
2
3
4
5
6
7
8
9
10
template<size_t n, size_t m>
int Sum(int (&matrix)[n][m]) {
  int result = 0;
 
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
      result += matrix[i][j];
 
  return result;
}
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
02.05.2010, 01:02  [ТС]     Двумерный массив в качестве параметра функции #8
а скажите, пожалуйста, как тогда будет выглядеть вызов функции Sum в главной функции

я думал так-
cout<< sum((&marks)[l][m]);
но не пашет...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.05.2010, 01:52     Двумерный массив в качестве параметра функции #9
velodro,
C++
1
cout << sum(marks);
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
02.05.2010, 01:54  [ТС]     Двумерный массив в качестве параметра функции #10
и эта тоже не пашет...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.05.2010, 02:06     Двумерный массив в качестве параметра функции #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
velodro, а поподробнее?
Все работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
template<size_t n, size_t m>
int Sum(int (&matrix)[n][m]) {
  int result = 0;
 
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
      result += matrix[i][j];
 
  return result;
}
 
int main() {
  int matrix[][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
  };
 
  std::cout << Sum(matrix) << std::endl;
 
  return 0;
}
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
02.05.2010, 11:44     Двумерный массив в качестве параметра функции #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если бы не было шаблонов????
Будет представление матрицы как простого массива, какая то кривизна получается.
Да язык C++ меня удивляет своей силой, но некоторые вещи в языке
стоило бы привести в порядок...
В конце концов придумали какую-нибудь фичу для передачи матриц,
динамических + статических(одинаково), что бы все было просто как с массивами.
Наверное, ни кто не хочет ни чего придумывать, потому как всех все устраивает,
только один я не доволен, этой кособокостью......
.......

Добавлено через 21 минуту
Вот уже придумал вещицу, только это надо в реализации языка делать.
Вариант вполне нормальный...
Передача стек матрицы, через массив указателей наведенных на матрицу

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
 
 
void print(int **matrix , int h , int w);
int main(){
const int H = 3;
const int W = 3;
int matrix[H][W] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
 
};
int *pmatr[H] = {NULL};
pmatr[0] =&matrix[0][0];
pmatr[1] =&matrix[1][0];
pmatr[2] =&matrix[2][0];
print(pmatr,H,W);
 
return 0;
}
 
void print(int **matrix , int h , int w){
    for( int i = 0; i < h ; i++){
        for( int j = 0 ; j < w; j++){
        cout<<matrix[i][j]<<' ';
        }
     cout<<endl;
    }
 
}

......

Добавлено через 21 минуту
.......
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
02.05.2010, 18:16  [ТС]     Двумерный массив в качестве параметра функции #13
CyBOSSeR, выдаёт вот такие ошибки..

Код
error C2265: '<Unknown>' : reference to a zero-sized array is illegal  (стр. 4)
error C2087: '<Unknown>' : missing subscript       (стр. 4)
error C2783: 'int __cdecl Sum(int (&)[1][1])' : could not deduce template argument for 'n'  (стр. 20)
error C2783: 'int __cdecl Sum(int (&)[1][1])' : could not deduce template argument for 'm'   (стр. 20)
и мне вот что не понятно: в качестве параметра можно давать имя массива и его размерность.. так для одномерного массива, но ведь первая переменная многомерного массива занимает тоже одну ячейку. Почему тогда нельзя сделать по аналогии с одномерным массивом. например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int sum(int mas[][],const int l,const int m);
 
int main(){
 
    int marks[l][m]={{1,2,-4,6},{0,5,-2,8}};
    cout<< sum(marks,l,m);
    return 0;
}
 
int sum(int mas[][],const int l,const int m)
{
    int s = 0;
    for (int i=0 ; i<m; i++)
        for (int j=0 ; j<m; j++)
            s += mas[i][j];
    return s;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.05.2010, 18:33     Двумерный массив в качестве параметра функции #14
velodro, приведенный код прекрасно работает в MSVS 2008, так что проблем не должно быть. В чем программируешь?
Genius Ignat
02.05.2010, 18:35
  #15

Не по теме:


Подозреваю это VC++ 6.0.

velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
02.05.2010, 18:38  [ТС]     Двумерный массив в качестве параметра функции #16
msvs 6.0
наверное не понимает template<size_t n, size_t m>
но да ладно.. мне нужно понять как сделать это самым стандартным образом для любого компилятора..
и всё же решение проблемы в использовании указателей на массив?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
02.05.2010, 18:58     Двумерный массив в качестве параметра функции #17
Проверил на своем VC++ 6.0 все точно как у тебя.
Вариант с массивом указателей можешь автоматизировать циклом:
C++
1
2
for( int i = 0; i < H ; i++)pmatr[i] = &matrix[i][0];
print(pmatr,H,W);
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
02.05.2010, 21:20  [ТС]     Двумерный массив в качестве параметра функции #18
а что в качестве параметра функции нужно использовать одномерный массив указателей на переменные многомерного массива? можете элементарно объяснить - как в должен выглядеть параметр - многомерный массив в описании создаваемой функции и как должен выглядеть этот параметр при вызове этой функции?... хотелось бы конкретики.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
02.05.2010, 21:53     Двумерный массив в качестве параметра функции #19
можете элементарно объяснить - как в должен выглядеть параметр - многомерный массив в описании создаваемой функции
Так: Type ** matrix;
matrix - это двойной указатель..
Двойной указатель предназначен для хранения адреса простого указателя.
Массив указателей реализуется на основе двойного константного указателя..
Двойной константный указатель всегда хранит адрес 1 первого указателя [0].


Мы передаем в функцию адрес первого указателя: наведенного на первую строку матрицы.

[][] - операция
-Первый параметр операции: первая скобка задает смещение:
указатель на какую строку должен использоваться, для дальнейшего смещения операцией ->
второй скобкой.

Если не понял, извиняй, указатели: это тема не из легких.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2010, 22:15     Двумерный массив в качестве параметра функции
Еще ссылки по теме:

Передача функции с двумерным массивов в качестве параметра C++
C++ Глобальное задание массива в качестве параметра функции
C++ Вызов функции с ссылкой на структуру в качестве параметра

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
02.05.2010, 22:15  [ТС]     Двумерный массив в качестве параметра функции #20
int sum(int **mas[][],const int l,const int m); - так должны выглядеть параметры в описании создаваемой функции?
как тогда должны выглядеть параметры при вызове функции в главной функции?
Yandex
Объявления
02.05.2010, 22:15     Двумерный массив в качестве параметра функции
Ответ Создать тему
Опции темы

Текущее время: 23:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru