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

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

Войти
Регистрация
Восстановить пароль
 
eoLithic
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
#1

Функция, принимающая двумерный массив - C++

06.02.2013, 18:50. Просмотров 715. Ответов 8
Метки нет (Все метки)

Дело такое:
Есть функция, которая в параметрах принимает двумерный массив. Причем двумерные массивы будут различаться, как в количество строк, так и в количестве столбцов.
Насколько я знаю, если функция принимает многомерные массивы, то необходимо указывать размеры второго и последующих измерений. В этом и загвоздка.
Есть ли какой-нибудь способ заставить функцию понимать сколько столбцов в двумерном массиве?
P.S.
Пожалуйста, без контейнеров, векторов и прочих извращений.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 18:50     Функция, принимающая двумерный массив
Посмотрите здесь:

C++ Двумерный массив и функция
Функция и двумерный массив. C++
двумерный массив и функция! C++
результатом вычисления фрагмента не является функция, принимающая 1 аргументов C++
Функция, принимающая в качестве параметра функцию C++
C++ Виртуальная функция, принимающая объекты поочередно
Функция и двумерный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,044
06.02.2013, 19:02     Функция, принимающая двумерный массив #2
Цитата Сообщение от eoLithic Посмотреть сообщение
Пожалуйста, без контейнеров, векторов и прочих извращений.
скорее наоборот. Пожалуйста, не без извращений.
Есть способ - задать размер в define, либо в глобальных const переменных. А если с массивами разного размера, то только передавая параметры в функцию.
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
06.02.2013, 19:07     Функция, принимающая двумерный массив #3
Через динамические массивы делайте.
eoLithic
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
06.02.2013, 19:10  [ТС]     Функция, принимающая двумерный массив #4
MrGluck,
Как будет выглядеть заголовок функции, которая принимает двумерный массив, не зная его размера, и 2 переменные, указывающие количество строк и колонок?
Вроде такого
C++
1
void arrayFunction( int a[][], row, column )
Но тут вопрос: ведь надо указывать размеры второго измерения массива.

Или так:
void arrayFunction( int a[ row ][ column ] ) // row и column уже определены в main()
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,044
06.02.2013, 19:11     Функция, принимающая двумерный массив #5
eoLithic,
C++
1
void arrayFunction( int **a, const int rows, const int columns )
и массив передавать динамический
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
06.02.2013, 19:13     Функция, принимающая двумерный массив #6
C++
1
2
3
4
5
int size = 20;
int** a = new int* [size];
for (int i = 0; i < size; i++)
     a[i] = new int [size];
foo (a,size);
C++
1
void foo (int**, int);
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,044
06.02.2013, 19:22     Функция, принимающая двумерный массив #7
Сейчас покажу все способы работы с двум. массивом
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
27
28
29
30
#include <iostream>
 
void foo(int **A, const int M, const int N)
{
    for (int i=0; i < M; i++)
    {
        for (int j=0; j < N; j++)
            std::cout << A[i][j] << " ";
        std::cout << std::endl;
    }
}
 
 
 
int main()
{
    const int M = 3, N = 4;
    int **arr = new int*[M];
    for (int i=0; i < M; i++)
    {
        arr[i] = new int[N];
        for (int j=0; j < N; j++)
            arr[i][j] = i * N + j;
    }
    foo(arr, M, N);
 
    for (int i=0; i < M; i++)
        delete []arr[i];
    delete []arr;
}
2. Уже работает лишь с конкретными размерами
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
#include <iostream>
 
const int M = 3;
const int N = 4;
 
void foo(int A[M][N])
{
    for (int i=0; i < M; i++)
    {
        for (int j=0; j < N; j++)
            std::cout << A[i][j] << " ";
        std::cout << std::endl;
    }
}
 
 
 
int main()
{
    int arr[M][N];
    for (int i=0; i < M; i++)
        for (int j=0; j < N; j++)
            arr[i][j] = i * N + j;
    foo(arr);
}
3. Похож на первый, но я бы назвал это С-стайл, по моему самый некорректный/недостойный.
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
#include <iostream>
#define M 3
#define N 4
 
void foo(int A[M][N])
{
    for (int i=0; i < M; i++)
    {
        for (int j=0; j < N; j++)
            std::cout << A[i][j] << " ";
        std::cout << std::endl;
    }
}
 
 
 
int main()
{
    int arr[M][N];
    for (int i=0; i < M; i++)
        for (int j=0; j < N; j++)
            arr[i][j] = i * N + j;
    foo(arr);
}
Есть еще вариант с magic number, его я вообще не буду рассматривать, это "вариант-не вариант".
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
06.02.2013, 19:22     Функция, принимающая двумерный массив #8
Цитата Сообщение от eoLithic Посмотреть сообщение
Пожалуйста, без контейнеров, векторов и прочих извращений.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <class T, int rows, int cols>
void foo(T (&matrix)[rows][cols])
{
    //...
}
 
int main()
{
    int a[2][3];
    double b[7][4];
    
    foo(a);
    foo(b);
    
    return 0;
}
"Извращение" с шаблоном. Вызывать просто, но минус в том, что для каждого массива генерируется свой экземпляр функции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2013, 19:48     Функция, принимающая двумерный массив
Еще ссылки по теме:

Функция, принимающая аргументы нескольких типов C++
Где ошибка?Функция, принимающая указатель на двумерный массив и рандом чисел C++
C++ Результатом вычисления фрагмента не является функция, принимающая 2 аргументов
C++ Функция принимающая контейнерный тип
C++ Шаблонная функция принимающая вектор - что-то не так с итератором

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

Или воспользуйтесь поиском по форуму:
alkagolik
Заблокирован
06.02.2013, 19:48     Функция, принимающая двумерный массив #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Похож на первый, но я бы назвал это С-стайл, по моему самый некорректный/недостойный.
лишь потому что в отличие от №2 константы заменил на директивы? c-style это вариант №1, а остальные это c99-style.
2eoLithic, КО намекает: в ряде случаев двумерный массив может быть фактически одномерным, кроме тех, когда массив действительно должен быть фактически двумерным (например, при независимо друг от друга изменяющихся размерах строк).
Цитата Сообщение от eoLithic Посмотреть сообщение
Есть ли какой-нибудь способ заставить функцию понимать сколько столбцов в двумерном массиве?
да. передать размеры параметрами функции.
Yandex
Объявления
06.02.2013, 19:48     Функция, принимающая двумерный массив
Ответ Создать тему
Опции темы

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