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

Передача двумерного массива в функцию - C++

Восстановить пароль Регистрация
 
Negent
 Аватар для Negent
9 / 9 / 1
Регистрация: 01.11.2011
Сообщений: 21
23.06.2014, 00:31     Передача двумерного массива в функцию #1
Как я знаю, имя массива и указателя тождественны в С++. Из этого следует, что можно инициализировать указатель, а работать с ним, как с именем массива, добавив индекс (квадратный скобки) или смещение к имени массива и круглые скобки со звёздочкой... Но не в этом суть. Я пробовал ввести передачу в функцию двумерного массива (столбы и строки) - не вышло. Очевидно, что где-то вкралась ошибка.
Вот код:
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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
const int size1 = 3;
const int size2 = 4;
int arr[size1][size2] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    
void arr_fun (int arr[][size2], int size1);
 
void main ()
{
    arr_fun (arr[][size2], size1);
    system ("pause");
}
void arr_fun (int arr[][size2], size1)
{
    for (int i=0; i<size1; i++)
    {
        for (int j=0; j<size2; j++)
        {
    cout<<"arr["<<i<<"]: "<<arr[i][j]<<endl;
        }
    }
}
Хотя бы дайте общие понятия по логике передачи адреса двух- и более мерного массива в функцию, а дальше, я сам попробую написать =)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 00:46     Передача двумерного массива в функцию #2
C++
1
arr_fun (arr, size1);
Negent
 Аватар для Negent
9 / 9 / 1
Регистрация: 01.11.2011
Сообщений: 21
23.06.2014, 01:15  [ТС]     Передача двумерного массива в функцию #3
Так-с... Передаётся число строк. А число столбцов не надо? В указанном Вами примере, фактически, передаётся только адрес первого (нулевого) элемента и число строк.
Как выполнен прототип и делается вызов функции с этим массивом, в самой функции будет обычное обращение: arr_fun[i][j]?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 01:43     Передача двумерного массива в функцию #4
Цитата Сообщение от Negent Посмотреть сообщение
ередаётся число строк. А число столбцов не надо?
В вашем коде, вообще ничего не надо, кроме имени массива, передавать, потому, что размеры глобально заданы. Иначе, нужно два размера передавать.
Negent
 Аватар для Negent
9 / 9 / 1
Регистрация: 01.11.2011
Сообщений: 21
23.06.2014, 01:49  [ТС]     Передача двумерного массива в функцию #5
А если я к примеру, уберу массив в функцию main(), как тогда надо выполнять передачу?

C++
1
2
3
4
5
6
7
8
void main ()
{
    const int size1 = 3;
    const int size2 = 4;
    int arr[size1][size2] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    arr_fun (arr[size1][size2], size1);
    system ("pause");
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 02:02     Передача двумерного массива в функцию #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
//#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;
 
void arr_fun (int arr[][4], int size1, int size2);
 
int main ()
{
    const int size1 = 3;
    const int size2 = 4;
    
    int arr[size1][size2] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    
    arr_fun (arr, size1, size2);
    
    system ("pause");
    return 0;
}
 
void arr_fun (int arr[][4], int size1, int size2)
{
    for (int i=0; i<size1; i++)
    {
        for (int j=0; j<size2; j++)
        {
            cout<<"arr["<<i<<"]: "<<arr[i][j]<<endl;
        }
    }
}
Negent
 Аватар для Negent
9 / 9 / 1
Регистрация: 01.11.2011
Сообщений: 21
23.06.2014, 02:18  [ТС]     Передача двумерного массива в функцию #7
Тогда можно size2 даже убрать (оно уже есть = 4). Но теперь возникает вопрос, можно ли не задавать фиксированным размер столбцов вот здесь:
C++
1
void arr_fun (int arr[][4], int size1, int size2);
Чтобы не передавать размеры массива (по столбцам), а жестко закрепить в функции:
C++
1
void arr_fun (int arr[][4], int size1);
Почему, кстати, функция передаёт только размер массива по столбцам? Для трёхуровневого массива такого, как
arr[x][y][z], тоже надо жесткое задание двух последних значений - y и z? Т.е., определение должно быть, как, например, arr[x][4][5]?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 02:32     Передача двумерного массива в функцию #8
Цитата Сообщение от Negent Посмотреть сообщение
Тогда можно size2 даже убрать (оно уже есть = 4).
Можно.
Цитата Сообщение от Negent Посмотреть сообщение
Но теперь возникает вопрос, можно ли не задавать фиксированным размер столбцов вот здесь:
Нужно задавать (int arr[][4]). Второй размер массива компилятор должен знать, чтобы вычислять (при индексации) начало следующей строки. Начало нулевой строки - arr + 0 * 4, первой - arr + 1 * 4, второй - arr + 2 * 4.
Цитата Сообщение от Negent Посмотреть сообщение
Для трёхуровневого массива такого, как
arr[x][y][z], тоже надо жесткое задание двух последних значений - y и z? Т.е., определение должно быть, как, например, arr[x][4][5]?
Да.
Negent
 Аватар для Negent
9 / 9 / 1
Регистрация: 01.11.2011
Сообщений: 21
23.06.2014, 18:53  [ТС]     Передача двумерного массива в функцию #9
Как ни крутился, всё равно без глобальных переменных обойтись не удалось:

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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
const int size2 = 4;
 
void show_arr (int arr[][size2], int);
 
void main ()
{
    static const int size1 = 3;
    int arr[size1][size2] = {{1,2,3,4},{4,5,6,7},{7,8,9,0}};
    show_arr (arr, size1);
    system ("pause");
}
void show_arr (int arr[][size2], int size1)
{
    for (int i=0; i<size1; i++)
    {
        for (int j=0; j<size2; j++)
        {
            cout<<"Array["<<i+1<<"]: "<<arr[i][j]<<endl;
        }
    }
}
Очевидно, что надо попробовать работать с динамическими массивами и шаблонами, чтобы передавать данные в другую "автономную" функцию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2014, 21:59     Передача двумерного массива в функцию
Еще ссылки по теме:

C++ Передача двумерного массива в функцию
Передача двумерного массива в функцию C++
C++ Передача двумерного массива в функцию

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

Или воспользуйтесь поиском по форуму:
StailGot
27 / 22 / 6
Регистрация: 25.08.2013
Сообщений: 41
23.06.2014, 21:59     Передача двумерного массива в функцию #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
template<size_t cx, size_t cy>
void show_arr( int (&arr)[cx][cy] )
{
  for ( size_t i = 0; i < cx; i++ )
    for ( size_t j = 0; j < cy; j++ )
      cout << "Array[" << i + 1 << "]: " << arr [i] [j] << endl;
}
 
void main()
{
  int arr [3] [4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
  ::show_arr( arr );
}
Yandex
Объявления
23.06.2014, 21:59     Передача двумерного массива в функцию
Ответ Создать тему
Опции темы

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