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

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

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

C++ Есть функция A принимающая прараметром указатель на функцию B. Как вместо последнего вставить тело B?
двумерный массив и функция! C++
Ошибка 1 error C2064: результатом вычисления фрагмента не является функция, принимающая 0 аргументов C++
результатом вычисления фрагмента не является функция, принимающая 1 аргументов C++
C++ error C2064: результатом вычисления фрагмента не является функция, принимающая 0 аргументов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
06.02.2013, 19:02     Функция, принимающая двумерный массив #2
Цитата Сообщение от eoLithic Посмотреть сообщение
Пожалуйста, без контейнеров, векторов и прочих извращений.
скорее наоборот. Пожалуйста, не без извращений.
Есть способ - задать размер в define, либо в глобальных const переменных. А если с массивами разного размера, то только передавая параметры в функцию.
coloc
погромист
 Аватар для 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
06.02.2013, 19:11     Функция, принимающая двумерный массив #5
eoLithic,
C++
1
void arrayFunction( int **a, const int rows, const int columns )
и массив передавать динамический
coloc
погромист
 Аватар для 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
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
 Аватар для 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++ в 8 и 10 строке результатом вычисления фрагмента не является функция принимающая 1 аргументов
C++ Виртуальная функция, принимающая объекты поочередно
C++ Error C2064: результатом вычисления фрагмента не является функция, принимающая 1 аргументов

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

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

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