Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Negent
9 / 9 / 1
Регистрация: 01.11.2011
Сообщений: 21
1

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

23.06.2014, 00:31. Просмотров 906. Ответов 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 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;
        }
    }
}
Хотя бы дайте общие понятия по логике передачи адреса двух- и более мерного массива в функцию, а дальше, я сам попробую написать =)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 00:31
Ответы с готовыми решениями:

Передача двумерного массива в функцию
Приветствую всех. Помогите пожалуйста советом. Уже три вечера сижу над одной...

Передача двумерного массива в функцию
Доброго времени суток, возникла проблема с передачей двумерного массива в с++....

Передача двумерного массива в функцию
Доброго времени суток. Как можно передать двумерный массив в функцию? Допустим...

Передача в функцию двумерного массива
Доброго времени суток. Есть двумерный массив, размерностью n на m. Нужно...

Передача двумерного массива в функцию.
Требуется написать функцию которая бы слагала и умножала матрицы. Для этого Я...

9
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 00:46 2
C++
1
arr_fun (arr, size1);
0
Negent
9 / 9 / 1
Регистрация: 01.11.2011
Сообщений: 21
23.06.2014, 01:15  [ТС] 3
Так-с... Передаётся число строк. А число столбцов не надо? В указанном Вами примере, фактически, передаётся только адрес первого (нулевого) элемента и число строк.
Как выполнен прототип и делается вызов функции с этим массивом, в самой функции будет обычное обращение: arr_fun[i][j]?
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 01:43 4
Цитата Сообщение от Negent Посмотреть сообщение
ередаётся число строк. А число столбцов не надо?
В вашем коде, вообще ничего не надо, кроме имени массива, передавать, потому, что размеры глобально заданы. Иначе, нужно два размера передавать.
0
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");
}
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 02:02 6
Лучший ответ Сообщение было отмечено Negent как решение

Решение

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;
        }
    }
}
1
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]?
0
alsav22
5442 / 4837 / 831
Регистрация: 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]?
Да.
1
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;
        }
    }
}
Очевидно, что надо попробовать работать с динамическими массивами и шаблонами, чтобы передавать данные в другую "автономную" функцию.
0
StailGot
28 / 23 / 12
Регистрация: 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 );
}
1
23.06.2014, 21:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2014, 21:59

Передача двумерного массива в функцию
проблема в том что в функция inicil не изменяет похожу массива, и в output...

Передача в функцию двумерного массива
Вводится две квадратные матрицы разного размера, посчитать сумму модулей...

Передача двумерного массива в функцию
Здравствуйте! Написала код для передачи двумерного массива в функцию:...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru