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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
03.08.2013, 09:08     Передача функции статического двумерного массива #1
Доброго времени суток, уважаемые жители Cyber-Forum. Не так давно я начал самостоятельно изучать Си++, и если честно, то ето вообще мой первый опыт в программировании, поэтому в процессе изучения накапливаются вопросы, на которые некому ответить. Мой вопрос уже задавался ранее неоднократно, так что он вряд ли покажется вам чем-то новым, но я спрошу, так как в прочитанных мноу темах я не смог удовлетворить своё любопытство.

Допустим, у нас есть статический двумерный массив
C++
1
int example[ rowSize ][ columnSize ];
где rowSize и columnSize - это некоторые константы:
C++
1
2
const int rowSize = 5;
const int columnSize = 7;
Как тогда будет выглядеть прототип некой функции someFunction, которая принимала бы в качестве аргумента этот массив?
Как вы можете видеть, число строк и столбцов зависит от констант rowSize и columnSize.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
03.08.2013, 09:17     Передача функции статического двумерного массива #2
Цитата Сообщение от StackOverflow Посмотреть сообщение
Как тогда будет выглядеть прототип некой функции someFunction, которая принимала бы в качестве аргумента этот массив?
Можно по ссылке передать:
C++
1
void someFunction(int (&array)[rowSize][columnSize])
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
03.08.2013, 09:33  [ТС]     Передача функции статического двумерного массива #3
А вызов будет выглядеть так?
C++
1
someFunction( example );
..и как будет выглядеть прототип?
У одномерного массива нужно было обязателно передавать его размер, почему же в случае с двумерным массивом ето правило не работает?
Спасибо, что так быстро откликнулись)
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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 );
да
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,284
Завершенные тесты: 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);
}
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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)
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
03.08.2013, 10:04  [ТС]     Передача функции статического двумерного массива #7
А почему число строк можно не указывать?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
03.08.2013, 10:37     Передача функции статического двумерного массива #8
Передавать сам массив по ссылке, а размеры массива сделать шаблонными параметрами:
C++
1
2
template <class T, size_t N, size_t M>
void func(T (&arr)[N][M])
Естественно, что работать будет только со статическими массивами.
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 и адрес первого элемента в массиве?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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;
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 )
{
// тело функции
}
выдаст ошибку?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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 )

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;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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 секунд
Т.е. тип первого аргумента - константный указатель.
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:38  [ТС]     Передача функции статического двумерного массива #15
Значит, можно передать и указатель, если в прототипе скобочки [], а не звёздочка *, так ведь?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
05.08.2013, 20:44     Передача функции статического двумерного массива #16
Цитата Сообщение от StackOverflow Посмотреть сообщение
Значит, можно передать и указатель, если в прототипе скобочки [], а не звёздочка *, так ведь?
Если в прототипе скобочки или звёздочка, в любом случае передаете указатель, только в случае
C++
1
print(array, 10);
будет иметь место преобразование array (имя массива) к указателю на первый элемент этого массива, т.е. тоже самое:
C++
1
print(&array[0], 10);
Добавлено через 2 минуты
Цитата Сообщение от StackOverflow Посмотреть сообщение
Значит, можно передать и указатель, если в прототипе скобочки [], а не звёздочка *, так ведь?
Ну, т.е. да, можно)
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
05.08.2013, 20:47  [ТС]     Передача функции статического двумерного массива #17
gray_fox, большое Вам спасибо, Вы мне очень помогли!
P.S. Можно по какому-либо вопросу обращаться к Вам за помощью прямо в ЛС?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
05.08.2013, 20:48     Передача функции статического двумерного массива #18
StackOverflow, лучше тему создавайте, разные люди подскажут...
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
06.08.2013, 13:54  [ТС]     Передача функции статического двумерного массива #19
А как можно было бы передать двумерный массив через конструктор класса или через set-функцию класса?
Допустим ли такой вариант:
C++
1
2
3
4
5
6
7
8
int main()
//...
int row = 4;
int column = 2;
double array[ row ][ column ] = { { 0 } };
double * arrayPtr = array;
//...
Example object( arrayPtr, row, column );
И если размерность массива, которую хранит объект, звисит от входных данных, как быть?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2013, 14:03     Передача функции статического двумерного массива
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.08.2013, 14:03     Передача функции статического двумерного массива #20
StackOverflow, даже если бы можно было создать двумерный массив с размерами, заданными переменными (не константами), то в 7 строке - несовместимость типов.
Yandex
Объявления
06.08.2013, 14:03     Передача функции статического двумерного массива
Ответ Создать тему
Опции темы

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