Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для _Cheshire Cat_
6 / 4 / 2
Регистрация: 22.11.2018
Сообщений: 83

Как можно использовать двумерный динамический массив в си++ через функцию

26.05.2019, 01:33. Показов 1332. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коротко говоря мне бы осознание синтаксиса чтоб я понимал.
Вот есть двумерный динамический массив (также можно написать мне код на трёх мерный динамический массив буду благодарен но это не обязательно ) я хочу его использовать в (конструкторах но возможно оно не так называется потому что я не знаю) (Функция вроде).
Вопрос 1: Как вызывать через функцию тот массив который мне нужен а не всё время первый.
Вопрос 2: Как обозначить его что именно из 10 массивов мне нужен 7 (а не 5 или 10) его как прописать.
Вопрос 3: Не хочу постоянно писать код, повторяя его, просто хочу вставил массив в функцию и всё. Надо отсортировать вставил в функцию сортировки мне выдало ответ, и так же проводить другие манипуляции, как не пытаюсь записать не получается.
Вопрос 4: Я выбрал самые такие наверно распространённые случаи если у вас есть ещё подскажите и объясните.

код просто как пример (он не работает и мысль в нём чтоб разобраться)
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
31
32
33
34
35
36
37
#include "pch.h"
#include <iostream>
using namespace std;
 
// Для меня это 6 разных функций 
//Возможно я выражаюсь не верно желательно меня поправить и объяснить.
// тут я их объявил 
int mass(понятно что тут должны быть переменные.);           //Создаём массива    функция 1
int mass_sm(понятно что тут должны быть переменные.);           // заполнение                функция 2
int mass_inN(понятно что тут должны быть переменные.);          // сравнение двух массивов          функция 3 
int mass_Osm(понятно что тут должны быть переменные.);        // сортировка                      функция 4
int mass_in(понятно что тут должны быть переменные.);            // и любая другая идея            функция 5
int mass_cout(понятно что тут должны быть переменные.);  //  вывод на экран                   функция 6
 
int main()
{//тут мы создаём 3 массива, первый сортируем, сравним два массива и выводим на экран 
mass(как сюда записать массив чтоб он был создан);
mass(как сюда записать массив чтоб он был создан и он был вторым. чтоб мы могли сравнить ?);// и я мог их различать какими методами 
mass_inN(); // тут сравниваем )как записать
mass_cout(ну это просто);
 
cout << "ля ля всо работает и танцы с бубном ";
return 0;
}
 
// при вызове функции
int mass(int a) {
        int  **arr = new int*[a];
        for (int count = 0; count < a; count++)
            arr[count] = new int[a]; 
// Rabotaet
        return 0;
    }
 
int mass_inN(){вот тут сравним }
 
int mass_cout {массив 1 или второй массив который мне понадобится } //а тут уже код который вызывает вывод массива на экран (того массива который мне нужен  если их тысяча а мне нужен 28)
П.С Если я делаю что то неверно объясните (Даже в оформлении темы) ведь со знающим человеком гораздо приятней говорить.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2019, 01:33
Ответы с готовыми решениями:

Как передать в функцию двумерный динамический массив?
#include &lt;iostream&gt; #include&lt;time.h&gt; #include&lt;cstdlib&gt; using namespace std; void zap(int array, int n) { ...

Как передать динамический двумерный массив в функцию
Имеется массив int main() { setlocale(LC_ALL, &quot;rus&quot;); int n, m; cout &lt;&lt; &quot;Введите количество строк: &quot;; cin &gt;&gt;...

Как правильно объявить двумерный динамический массив через malloc
Подскажите как правильно объявить двумерный динамический массив через malloc типа инт размером 100х100?

16
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,971
Записей в блоге: 3
26.05.2019, 06:22
_Cheshire Cat_,
можете глянуть вот тут:
https://www.cyberforum.ru/post13556015.html
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.05.2019, 10:26
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
Коротко говоря мне бы осознание синтаксиса чтоб я понимал.
_Cheshire Cat_, дело не в синтаксисе.
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
двумерный многомерный динамический массив
Не может быть обобщён кратко. Я пишу многомерный видя:
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
Как обозначить его что именно из 10 массивов мне нужен 7 (а не 5 или 10) его как прописать.
Многомерный "массив" в динамической памяти может иметь разные размеры по измерениям (в предельном случае - все измерения разные). Поэтому описание такой структуры не может быть элегантным и лаконичным.
Ваш вопрос можно обобщить в виде:
Цитата Сообщение от вариации на тему
Как мне создать такую штуковину, чтобы в ней разместить любую штуковину? И чтобы в функцию можно было передать контекст из которого ясно какую из штуковин в штуковине я имею в виду.
Осталось написать функцию, которая сама догадается о том, что нужно сделать и сколько раз.
----
Я бы предложил воспользоваться vector<vector<T>>. Эта структура может быть любой, в разумных пределах, вложенности. Она сама выделяет и освобождает память, знает размеры своих измерений, имеет поддержку со стороны классов vector, vector::iterator (и пр.) и библиотеки алгоритмов. А вот функции нужно обеспечить доступ к контексту в котором лежит информация о участке с которым ей предстоит поработать. Можно создать целый тип в котором объект содержит описание такого контекста. Можно даже, создать тип, который содержит такой вектор векторов и набор функций для работы с ним.
1
 Аватар для _Cheshire Cat_
6 / 4 / 2
Регистрация: 22.11.2018
Сообщений: 83
26.05.2019, 16:20  [ТС]
IGPIGP, Сразу видно у вас большой опыт.
Это наверно самое верное описание моего вопроса.
"Как мне создать такую штуковину, чтобы в ней разместить любую штуковину? И чтобы в функцию можно было передать контекст из которого ясно какую из штуковин в штуковине я имею в виду."
0
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
26.05.2019, 16:30
C++
1
void* shtukovina(void*);
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.05.2019, 17:33
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
Это наверно самое верное описание моего вопроса.
"Как мне создать такую штуковину, чтобы в ней разместить любую штуковину? И чтобы в функцию можно было передать контекст из которого ясно какую из штуковин в штуковине я имею в виду."
Даже std::any тут не поможет. В языке со статической типизацией, это вопрос не имеющий разумного ответа. Посмотрите, что Termit779, написал. Штуковина vs морковина = хреновина.
_Cheshire Cat_, типы для того и созданы, чтобы было легко, весело и безопасно. Поэтому, возникает вопрос: "Зачем вам это нужно?"
1
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
26.05.2019, 17:57
Цитата Сообщение от IGPIGP Посмотреть сообщение
Поэтому, возникает вопрос: "Зачем вам это нужно?"
Может он пишет драйвера на С++?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.05.2019, 18:43
Цитата Сообщение от Termit779 Посмотреть сообщение
Может он пишет драйвера на С++?
Это может потребовать создание структуры "массив с произвольным количеством измерений" и функций принимающих такие массивы? Termit779, насколько мне известно, любой самодельный "полиморфизм" на энамах, свичах, кастах указателей на void, равно как и объединениях, - это медленно. Получая упаковку, любой жирный интерфейс сначала должен обнюхать, развернуть и пр. А драйвера, это ведь уровень, где время дорого как память. А иной раз, даже дороже памяти.
1
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
26.05.2019, 22:03
Цитата Сообщение от IGPIGP Посмотреть сообщение
уровень, где время дорого как память. А иной раз, даже дороже памяти.
Можно даже сказать это место, где требования к скорости выше чем к безопасности.

Вообще мое сообщение было как сарказм!!!
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.05.2019, 23:42

Не по теме:

Цитата Сообщение от Termit779 Посмотреть сообщение
Вообще мое сообщение было как сарказм!!!
Шутка? А я попался - принял всерьёз. Это так редко бывает, что даже развеселило)


0
 Аватар для _Cheshire Cat_
6 / 4 / 2
Регистрация: 22.11.2018
Сообщений: 83
26.05.2019, 23:42  [ТС]
IGPIGP, Зачем мне это нужно.
Ну чтоб постоянно не писать что я создаю массив 1 с названием arr[][] два цикла и заполнение
потом пишу второй такой же цикл ну уже arr1[][] и снова два цикла .
А так создал функцию написал два цикла и она создаёт нужное количество массивов скажем 5 пустых массивов.
Вызвал функцию заполнения выбрал скажем 3 из них остальные не пригодились. Вызвал функцию которая выводит их на экран.

потом вызвал функцию которая сравнит 1 и 2 массив. и функция которая запишет это в 4 .
потом вызвал которая сравнит 1 и 3 массив. и запишет это в 5 .
потом снова вызвал функцию которая сравнит 4 и 5 и выведет на экран.
Но зачем мне это нужно чтоб не писать всё это в ручную и облегчить себе жизнь и задания в будущем.
Конкретного задания у меня нет чтоб показать более детально могу только так на пальцах объяснить.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.05.2019, 00:03
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
остальные не пригодились
Это плохо как стиль. _Cheshire Cat_, можно выбрать язык, где всё ещё легче, но в плюсах, это неуместно.
А где предел? 3,5, 10 измерений? Сколько? И надо же передавать размер по каждому измерению. И ещё пригоршню индексов для обращения к заданному элементу.
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
Ну чтоб постоянно не писать что я создаю массив 1 с названием arr[][] два цикла и заполнение
Создавайте вектор векторов.
Есть, шаблон с размером времени компиляции std::array но тут те же константы времени компиляции, но поддержка шире чем у с-массива (у которого кроме операции индексации ничего больше, по сути и нет). Глядя на него имеет смысл задуматься, почему бородатые дядьки из комитета не создали чего-то волшебного. Как говорил проф. Преображенский: -"Двум богам служить нельзя." Статическая типизация и типы определяемые во время выполнения (если это не контейнерные структуры), - две вещи несовместные.

Добавлено через 4 минуты
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
Ну чтоб постоянно не писать что я создаю массив 1 с названием arr[][] два цикла и заполнение
потом пишу второй такой же цикл ну уже arr1[][] и снова два цикла .
покажите задачу, где вам это нужно. Не для любой задачи и на всякий случай, а конкретно.
0
 Аватар для _Cheshire Cat_
6 / 4 / 2
Регистрация: 22.11.2018
Сообщений: 83
27.05.2019, 00:13  [ТС]
IGPIGP, Ну что я постараюсь что то придумать.
Тапками в меня не кидать он не работает так как я это только что придумал как пример. (НЕСЁТ ТОЛЬКО ПОКАЗАТЕЛЬНЫЙ СМЫСЛ)
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
31
32
33
34
35
36
37
38
39
40
41
                        cout << top;
        
                       //cоздание двумерного динамического массива
                       // А если мне 3 массива то я бы хотел функцию типо
//   int создание двумерного массива (int массив который хотите создать [строки ][столбцы])
 
            int  **arr = new int*[столбцы];
            for (int i = 0; i < столбцы; i++) {
                arr[i] = new int[строки];
            }
            
 
            //заполнение массива 
            arr[строки][столбцы];
            srand(time(NULL));
 
            for (int i = 0; i < top + 1; i++) {
                for (int j = 0; j < top + 1; j++) {
                    arr[i][j] = rand() % 11;
 
                }
            }
              // вывод массива на экран  
             mass_cout(массив который вывести);
 
 
//функция вывода массива
int mass_cout(массив который вывести) {
    for (int i = 0; i < a + 1; i++) {
        for (int j = 0; j < a + 1; j++) {
            cout << arr[i][j];
        }
    }
 
}
 
//функция примера создания массива
  int создание двумерного массива (int массив который хотите создать [строки ][столбцы])
int  **массив = new int*[строки];
            for (int i = 0; i < строки; i++) {
                arr[i] = new int[столбцы];
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.05.2019, 00:34
_Cheshire Cat_, святое дело. есди количество измерений известно на момент компиляции. То что вы показываете - реализация размера по каждому из уже известных измерений (а именно, из 2 шт.), но что если измерений не 2 как вы написали вверху топика:
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
Как обозначить его что именно из 10 массивов мне нужен 7 (а не 5 или 10) его как прописать.
То есть, как быть, если вы параметризуете и количество измерений, задавая при этом размер каждого? Фактически нужно реализовать код, который будет рекурсивно (в цикле не знаю как) выделять память под указатели разного ранга (по нисходящей). Для трехмерного массива это Т*** массив T** а тот, далее, массив T* который даст массив T.
Причём, для общности, каждое измерение может иметь уникальный размер.
Вот помесь дикого с-массивчика с одомашненным шаблоном С++ (схема и мишень для тапок, как вы говорите) :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
template< size_t N, typename T>
class DimArray
{
 T array[N];   
};
 
int main()
{
DimArray<2, DimArray<3,  DimArray<4,  int > > > threeDimArray; 
  
cin.get();
return 0;
}
Это гораздо более простая грубая модель. Тут все размеры одного ранга одинаковы. Но, тем не менее, может она поможет прояснит для вас ситуацию. Посмотрите и подумайте как объявить функцию, которая будет успешно работать с этим классом любой арности.
0
 Аватар для _Cheshire Cat_
6 / 4 / 2
Регистрация: 22.11.2018
Сообщений: 83
27.05.2019, 00:59  [ТС]
IGPIGP, Ой тут мне Коментарии нужны так как с классами очень поверхностно знаком ладно. Тогда последний вопрос не по теме.
C++
1
2
3
4
5
6
7
8
9
10
int mass_cout(int arr[255][255], int a);  это обьявление функции
mass_cout(**arr[top+1][top+1],top+1); это то что надо записать чтоб получилось (ВОТ В ЭТОМ МОМЕНТЕ ВЫДАЁТ ОШИБКУ)= операнд* должен быть указателем.
int mass_cout(int arr[255][255], int a) {                       // а это вызов самой функции 
    for (int i = 0; i < a + 1; i++) {
        for (int j = 0; j < a + 1; j++) {
            cout << arr[i][j];
        }
    }
 
}
Как правильно записать ?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.05.2019, 01:13
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
Как правильно записать ?
Глядя в код я не понимаю, что вы хотите сделать. А ответ на ваш вопрос зависит от того, что именно вы хотели сделать. И ведь, это самое интересное в данном разговоре, потому как я так и не увидел ответа на вопрос:
Цитата Сообщение от IGPIGP Посмотреть сообщение
покажите задачу, где вам это нужно. Не для любой задачи и на всякий случай, а конкретно.
Вот для прикола мю-рекурсивный (если не ошибаюсь) ) алгоритм распечатывающий измерения.
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>
using namespace std;
template< size_t N, typename T>
class DimArray
{
public:
 T array[N];
 T& operator[](size_t i){return array[i];}
};
 
template<size_t N1, class T>
void arrayTreater(DimArray<N1,  T>  arr)
{
  cout<<N1;
}
 
template<size_t N1, size_t N2, class T>
void arrayTreater(DimArray<N1, DimArray<N2, T>> arr)
{
    cout<<N1<<endl;
    arrayTreater(arr[0]);
}
 
int main()
{
DimArray<2, DimArray<3,  DimArray<4,  int > > > threeDimArray;
 arrayTreater(threeDimArray);
cin.get();
return 0;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.05.2019, 02:26
Цитата Сообщение от _Cheshire Cat_ Посмотреть сообщение
IGPIGP, Ну что я постараюсь что то придумать.
Тапками в меня не кидать
Читал, читал и кажется понял. Вы хотите получить функции которые работают с 2-мерными массивами и для примера привели код который выполняется в них. Одна - выделяет, другая - заполняет, третья, - выводит? Это легко. Передаёте ссылку на указатель в первую и два беззнаковых целых (измерения). В ней выделяете память. Сразу скажу, что выделение в функции и использование за её пределами, это возможно, но нужно помнить что где-то нужно будет это освобождать, а стало быть нужно иметь хотя бы первое измерение измерение там. В остальные функции передаётся указатель и два измерения.
Но вы же хотели многомерные массивы. Можно понаписать перегрузок до, скажем, десятка измерений, но это достаточно грубо. А представляете как радостно передавать указатель с шестью звёздами и шесть измерений в вариант перегруженный как:
template<class T> void printArray(T****** arr, size_t dim0, size_t dim1, size_t dim2, size_t dim3, size_t dim4, size_t dim5);
?
Лучше уж пользоваться чем-то вроде vector<vector<...<vector<T>...> vec_n_dim;. А для учёбы - писать конкретные функции под актуальный для задачи случай.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2019, 02:26
Помогаю со студенческими работами здесь

Можно ли использовать данные из DGV как двумерный массив
if (flag) dataGridView1 -&gt;Style -&gt;BackColor:: set (clr); в этой строчке не могу понять что такое . как я понял это индексы строчек и...

Динамический двумерный массив в функцию.
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;time.h&gt; using namespace std; void razmerimassiva(int...

Передать двумерный динамический массив в функцию
Стоит такая задача: Написать функцию, которая в матрице C(3,5) заменяет отрицательные элементы их модулями; положительные элементы,...

Динамический двумерный массив char через new?
В общем, нужно создать n-ое количество двухсимвольных строк char. Как правильно выделить память под него, используя new? Просто, следуя...

Динамический массив через функцию
int num_char(char *ch) { int i = -1; do { i++; } while(*(ch+i) != '\0'); cout &lt;&lt; endl &lt;&lt; i &lt;&lt; endl; return...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru