Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/47: Рейтинг темы: голосов - 47, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32

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

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

Студворк — интернет-сервис помощи студентам
Дело такое:
Есть функция, которая в параметрах принимает двумерный массив. Причем двумерные массивы будут различаться, как в количество строк, так и в количестве столбцов.
Насколько я знаю, если функция принимает многомерные массивы, то необходимо указывать размеры второго и последующих измерений. В этом и загвоздка.
Есть ли какой-нибудь способ заставить функцию понимать сколько столбцов в двумерном массиве?
P.S.
Пожалуйста, без контейнеров, векторов и прочих извращений.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.02.2013, 18:50
Ответы с готовыми решениями:

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

Функция, принимающая 4 указателя
Написать функцию, принимающие 4 указателя на вещественные переменные и заменяющую значения второй из них суммой значений первых двух,...

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

8
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.02.2013, 19:02
Цитата Сообщение от eoLithic Посмотреть сообщение
Пожалуйста, без контейнеров, векторов и прочих извращений.
скорее наоборот. Пожалуйста, не без извращений.
Есть способ - задать размер в define, либо в глобальных const переменных. А если с массивами разного размера, то только передавая параметры в функцию.
0
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
06.02.2013, 19:07
Через динамические массивы делайте.
0
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 32
06.02.2013, 19:10  [ТС]
MrGluck,
Как будет выглядеть заголовок функции, которая принимает двумерный массив, не зная его размера, и 2 переменные, указывающие количество строк и колонок?
Вроде такого
C++
1
void arrayFunction( int a[][], row, column )
Но тут вопрос: ведь надо указывать размеры второго измерения массива.

Или так:
void arrayFunction( int a[ row ][ column ] ) // row и column уже определены в main()
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.02.2013, 19:11
eoLithic,
C++
1
void arrayFunction( int **a, const int rows, const int columns )
и массив передавать динамический
1
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
06.02.2013, 19:13
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
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.02.2013, 19:22
Сейчас покажу все способы работы с двум. массивом
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
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
06.02.2013, 19:22
Цитата Сообщение от 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
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
06.02.2013, 19:48
Цитата Сообщение от MrGluck Посмотреть сообщение
Похож на первый, но я бы назвал это С-стайл, по моему самый некорректный/недостойный.
лишь потому что в отличие от №2 константы заменил на директивы? c-style это вариант №1, а остальные это c99-style.
2eoLithic, КО намекает: в ряде случаев двумерный массив может быть фактически одномерным, кроме тех, когда массив действительно должен быть фактически двумерным (например, при независимо друг от друга изменяющихся размерах строк).
Цитата Сообщение от eoLithic Посмотреть сообщение
Есть ли какой-нибудь способ заставить функцию понимать сколько столбцов в двумерном массиве?
да. передать размеры параметрами функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.02.2013, 19:48
Помогаю со студенческими работами здесь

Функция принимающая и передающая массивы
Здравствуйте ! Задание.Создать функцию, которая получает массив ,как параметр и возвращает в основную программу изменённый массив или же...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru