Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
#1

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

03.08.2013, 09:08. Просмотров 2945. Ответов 28
Метки нет (Все метки)

Доброго времени суток, уважаемые жители Cyber-Forum. Не так давно я начал самостоятельно изучать Си++, и если честно, то ето вообще мой первый опыт в программировании, поэтому в процессе изучения накапливаются вопросы, на которые некому ответить. Мой вопрос уже задавался ранее неоднократно, так что он вряд ли покажется вам чем-то новым, но я спрошу, так как в прочитанных мноу темах я не смог удовлетворить своё любопытство.

Допустим, у нас есть статический двумерный массив
C++
1
int example[ rowSize ][ columnSize ];
где rowSize и columnSize - это некоторые константы:
C++
1
2
const int rowSize = 5;
const int columnSize = 7;
Как тогда будет выглядеть прототип некой функции someFunction, которая принимала бы в качестве аргумента этот массив?
Как вы можете видеть, число строк и столбцов зависит от констант rowSize и columnSize.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2013, 09:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача функции статического двумерного массива (C++):

Передача статического двумерного массива в функцию - C++
Добрый вечер. Вот один из способов передачи статической матрицы в ф-ию: void f(int arr) { ... } Подскажите, что на самом...

Передача двумерного статического массива в функцию - C++
#include "stdafx.h" #include <iostream> #include <time.h> #include <cstdlib> #include <fstream> using namespace std; void...

Передача статического двумерного массива, как параметра - C++
Не компилируется, пишет что не может открыть файл #include <iostream> #include <conio.h> #include<cstdlib> using namespace...

Передача двумерного статического/автоматического массива в функцию - C++
прототип void func(int **data, size_t n, size_t m);. Динамический передаётся int main () { int **a; size_t n; size_t m; ...

Передача двумерного массива в функции - C++
Мне нужно передать массив в функцию, а затем из этой функции в другую функцию. Вот код: #define _CRT_SECURE_NO_WARNINGS #define...

Передача двумерного массива в функции - C++
Здравствуйте. В c++ недавно. Компилятор ругается. Как правильно передать двумерный массив в функции? И вообще, какие замечания по коду? ...

28
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
03.08.2013, 09:17 #2
Цитата Сообщение от StackOverflow Посмотреть сообщение
Как тогда будет выглядеть прототип некой функции someFunction, которая принимала бы в качестве аргумента этот массив?
Можно по ссылке передать:
C++
1
void someFunction(int (&array)[rowSize][columnSize])
1
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
03.08.2013, 09:33  [ТС] #3
А вызов будет выглядеть так?
C++
1
someFunction( example );
..и как будет выглядеть прототип?
У одномерного массива нужно было обязателно передавать его размер, почему же в случае с двумерным массивом ето правило не работает?
Спасибо, что так быстро откликнулись)
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
03.08.2013, 09:47 #4
Цитата Сообщение от StackOverflow Посмотреть сообщение
У одномерного массива нужно было обязателно передавать его размер, почему же в случае с двумерным массивом ето правило не работает?
Да те же самые правила...
Массив по значению передать нельзя, либо в виде ссылки, либо в виде указателя (здесь надо отдельно передавать размер)
Ссылка:
C++
1
void function(int (&array)[size])
Указатель + размер:
C++
1
void function(int * array, std::size_t size)
Цитата Сообщение от StackOverflow Посмотреть сообщение
А вызов будет выглядеть так?
someFunction( example );
да
1
alexcoder
1546 / 691 / 90
Регистрация: 03.06.2009
Сообщений: 3,665
Завершенные тесты: 1
03.08.2013, 09:48 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    const int rowSize = 5;
    const int columnSize = 7;
 
void someFunction(int m[][columnSize])
{
    for(int i=0;i<rowSize;i++)
    {
        for(int j=0;j<columnSize;j++)
        {
        }
    }
}
void main()
{
    int example[ rowSize ][ columnSize ];
    someFunction(example);
}
1
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.08.2013, 09:50 #6
масса вариантов:
int a[M][N];

void F(int a[M][N], int m, int n)
void F(int a[][N], int m, int n)
void F(int (*a)[N], int m, int n)
1
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
03.08.2013, 10:04  [ТС] #7
А почему число строк можно не указывать?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
03.08.2013, 10:37 #8
Передавать сам массив по ссылке, а размеры массива сделать шаблонными параметрами:
C++
1
2
template <class T, size_t N, size_t M>
void func(T (&arr)[N][M])
Естественно, что работать будет только со статическими массивами.
1
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 19:20  [ТС] #9
Поправьте пожалуйста, если я в чём-то ошибаюсь.

Указатель - это ячейка в памяти, которая после инициализации хранит адрес другой ячейки в памяти, хранящей некоторое значение.
После применения к указателю операции разыменования, мы фактически попадаем в ту ячейку, хранящую значение.
Ссылка - это альтернативное имя для переменной, к которой привязана ссылка.
Тогда имя массива - это указатель на первый элемент в массиве, который хранит адрес этого первого элемента.
Допустим:
C++
1
2
3
4
5
6
7
8
9
10
11
int array1[ 10 ] = { 0 }; //array1 ни что иное, как &array1[ 0 ]
//тогда
int * arrayPtr = array1; //arrayPtr теперь хранит тот же адрес первого элементы &array1[ 0 ]
//а если
int * arrayPtr1 = &arrayPtr; //то arrayPtr1 будет хранить адрес, по которому расположен указатель arrayPtr
//далее
cout << array1[ 0 ] << *arrayPtr << arrayPtr[ 0 ] << *array1 << endl; //выведет 0 во всех случаях
cout << arrayPtr << array1 << endl; // выведет адрес, по которому расположен первый элемент в массиве
cout << arrayPtr1 << endl; // выведет адрес, по которому расположен указатель arrayPtr
cout << *arrayPtr1 << endl; // выведет то, что находится по адресу указателя arrayPtr, а именно адрес первого элемента в массиве
cout << *( *arrayPtr1 ) << endl; // выведет значение первого элемента в массиве
Тогда почему, если мне нужно передать arrayPtr, то нужно в функции специфицировать, что в качестве аргумента поступит указатель, а когда я просто передаю имя массива array1, то ничего специфицировать не нужно? Помогите, пожалуйста, разобраться в этих тонкостях. И ещё, совпадает ли адрес array1 и адрес первого элемента в массиве?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
05.08.2013, 19:32 #10
Цитата Сообщение от StackOverflow Посмотреть сообщение
Тогда имя массива - это указатель на первый элемент в массиве, который хранит адрес этого первого элемента.
Имя массива почти во всех контекстах неявно приводится к указателю на первый элемент.

Добавлено через 2 минуты
Но не при sizeof, например:
C++
1
2
3
4
5
int array[10];
int * arrayPtr = array;
 
std::cout << "sizeof (array) = " << sizeof (array) << std::endl;
std::cout << "sizeof (arrayPtr) = " << sizeof (arrayPtr) << std::endl;
1
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:20  [ТС] #11
gray_fox, большое Вам спасибо, что помогаете. Хочу всё таки уточнить разницу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void print( const int * [], const int );
 
int main()
{
    int array[ 10 ] = { 0 };
    int * arrayPtr = array;
 
    print( array, 10 );
    print( arrayPtr, 10 );
 
    return 0;
}
 
void print( const int * arrayToPrint[], const int size )
{
// тело функции
}
выдаст ошибку?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
05.08.2013, 20:26 #12
StackOverflow, если имелось ввиду
C++
1
void print( const int *, const int )
то нет, всё в порядке.

Добавлено через 2 минуты

Не по теме:

P.S.: "внешний" const параметра ф-ии не влияет на её сигнатуру, т.е. можно так:

C++
1
2
3
4
5
void print( const int *,  int );
 
// ...
 
void print( const int * const arrayToPrint, const int size )

0
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:31  [ТС] #13
Ах, вот, кажется заметил наконец, в чём разница!) Если поставить квадратные скобочки, то это уже будет своего рода разыменованием, да? А если вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
//то же самое только подправлю чуть-чуть прототип
void print( const int [], const int );
 
int main()
{
//................
print( array, 10 );
print( arrayPtr, 10 );
 
return 0;
}
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
05.08.2013, 20:33 #14
Цитата Сообщение от StackOverflow Посмотреть сообщение
C++
1
void print( const int [], const int );
Ну вообще это тоже самое, что и
C++
1
void print( const int *const, const int );
Добавлено через 49 секунд
Т.е. тип первого аргумента - константный указатель.
1
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:38  [ТС] #15
Значит, можно передать и указатель, если в прототипе скобочки [], а не звёздочка *, так ведь?
0
05.08.2013, 20:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2013, 20:38
Привет! Вот еще темы с ответами:

Передача двумерного массива из функции в функцию - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; const int n=10; void func_1(); int func_2(int...

Передача двумерного массива в качестве аргумента функции - C++
Подскажите пожалуйста что не так? (Подчёркивает вот тут вот index(A); аргумент функции). Объясните пожалуйста в чём моя ошибка. ...

Передача элементов двумерного массива в параметры функции - C++
Подскажите. Есть к примеру матрица int mat4; и ее нужно передать в параметры функции. Как это сделать?)

Передача двумерного массива типа String в функции - C++
Здравствуйте! Изучаю SFML, в уроке весь код находиться в одном cpp файле, я решил разнести все как положено по файлам но наткнулся на...


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

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

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