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

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

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

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

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

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

Где ошибка?Функция, принимающая указатель на двумерный массив и рандом чисел - C++
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; void arrprint(float* arr, int m, int n) { ...

Функция принимающая контейнерный тип - C++
функция должна принять контейнерный шаблонный класс но шаблон определен внутри. Вобщем, на вход подаем list, vector и тд. А на выход...

Виртуальная функция, принимающая объекты поочередно - C++
есть класс у него 2 дочерних, есть статическая функция вызывающая ф-ю вывода на экран все объетты класса+дочерние, нужно написать такую же...

Функция, принимающая аргументы нескольких типов - C++
Доброго времени суток. Написал скромный класс Log для логирования чего либо в файл, потом мб пригодится... Убрал в статическую библиотеку. ...

Функция, принимающая в качестве параметра функцию - C++
Навести пример функции, которая в качестве параметра принимает функцию

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

8
MrGluck
Модератор
Эксперт CЭксперт С++
7525 / 4663 / 704
Регистрация: 29.11.2010
Сообщений: 12,738
06.02.2013, 19:02 #2
Цитата Сообщение от eoLithic Посмотреть сообщение
Пожалуйста, без контейнеров, векторов и прочих извращений.
скорее наоборот. Пожалуйста, не без извращений.
Есть способ - задать размер в define, либо в глобальных const переменных. А если с массивами разного размера, то только передавая параметры в функцию.
0
coloc
погромист
411 / 247 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
06.02.2013, 19:07 #3
Через динамические массивы делайте.
0
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()
0
MrGluck
Модератор
Эксперт CЭксперт С++
7525 / 4663 / 704
Регистрация: 29.11.2010
Сообщений: 12,738
06.02.2013, 19:11 #5
eoLithic,
C++
1
void arrayFunction( int **a, const int rows, const int columns )
и массив передавать динамический
1
coloc
погромист
411 / 247 / 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);
1
MrGluck
Модератор
Эксперт CЭксперт С++
7525 / 4663 / 704
Регистрация: 29.11.2010
Сообщений: 12,738
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, его я вообще не буду рассматривать, это "вариант-не вариант".
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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;
}
"Извращение" с шаблоном. Вызывать просто, но минус в том, что для каждого массива генерируется свой экземпляр функции.
0
alkagolik
Заблокирован
06.02.2013, 19:48 #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Похож на первый, но я бы назвал это С-стайл, по моему самый некорректный/недостойный.
лишь потому что в отличие от №2 константы заменил на директивы? c-style это вариант №1, а остальные это c99-style.
2eoLithic, КО намекает: в ряде случаев двумерный массив может быть фактически одномерным, кроме тех, когда массив действительно должен быть фактически двумерным (например, при независимо друг от друга изменяющихся размерах строк).
Цитата Сообщение от eoLithic Посмотреть сообщение
Есть ли какой-нибудь способ заставить функцию понимать сколько столбцов в двумерном массиве?
да. передать размеры параметрами функции.
0
06.02.2013, 19:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2013, 19:48
Привет! Вот еще темы с ответами:

Функция и двумерный массив. - C++
День добрый. У меня такое задание: нужно создать функцию которая будет находить сумму элементов в тех строках, которые содержат хотя бы...

Двумерный массив и функция - C++
Нууууу плиззз подскажите как сделать в виде отдельной функции????? Borland C++ #include&lt;iostream.h&gt; #include&lt;math.h&gt; ...

двумерный массив и функция! - C++
Парни помогите, чего-то я не догоняю! у меня есть функция kol она считает сколько столбцов с нулевым элементом встречается и плюсует в...

Функция и двумерный массив - C++
Я не знаю в чём проблема заключается на этом этапе, но гуглил я много. Если не сложно, просто исправьте код под нужный или объясните, как...


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

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

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