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

Как передать двумерный динамический массив в функцию c

Передача двумерного динамического массива в функцию (Си)

Подскажите как правильно передать двумерный динамический массив в функцию. Функция не возвращает значения (void), массив в ней должен изменяться. При передачи в аргумент просто int **Arr, создается копия и изменяется только копия, мне же нужно чтобы изменялся именно передаваемый через аргументы массив.

Во-первых, «возвращаемые» параметры вам в такой ситуации придется передавать «по указателю». Так как сами «возвращаемые» параметры имеют тип int ** , то при передаче «по указателю» они превратятся в int ***

Во-вторых, чтобы не путаться в «звездочках», выделение памяти я бы порекомендовал делать через следующую идиому

(и заодно избавиться от манеры явно приводить результат malloc )

В-третьих, в качестве опциональной модификации можно предложить выделять память второго уровня единым блоком, а не множественными вызовами malloc

При вызове такой функции, разумеется, надо не забывать передавать именно указатели на указатели-приемники

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

Функции и динамические двумерные массивы

Здравствуйте, любители C++, как я вам и обещал, сегодня мы с вами разберем динамические массивы и напишем свои собственные функции. За основу мы возьмем задание из статьи №3, где мы работали с двумерным массивом размерностью 8×8.

Вспомним то задание(оригинал в статье №3) и запишем его немножко в другом виде:
Для заданной матрицы размером n на m найти такие k, что k-ая строка матрицы совпадает с k-ым столбцом.
Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

Начнем:
Ну во первых я должен вас поздравить: мы переходим к функциональному программированию, и это уже можно считать достижением.

Для начала нам следует подключить стандартные библиотеки, пространство имен, и, самое главное, объявить наши функции.
Объявляют функцию в C++ следующим образом:

1) Тип возвращаемых данных
То есть если написать в самом начале int, то это значит что функция вернет какое то целочисленное значение, как видите, функция sozdanie возвращает динамический двумерный массив целых чисел(да именно так он обозначается int**), если же написать в начале объявления тип void(как во всех остальных функциях), то это означает, что функция ничего не возвращает(но не путайте, она все же что то делает с нашими данными).

2) Имя функции
Здесь все просто: мы просто придумываем имя нашим функциям(желательно, чтобы имя отражало суть функции).

3) Список параметров
Чтобы наши функции что то делали, им нужно передать какие то данные. Например функция sozdanie, она принимает 2 параметра: число строк n и число столбцов m, и на основе этих данных создает двумерный массив.

Только не путайте: мы пока что только объявили эти функции, после этого нам следует описать их, то есть написать, что каждая из них делает.

Таким образом описываются функции в C++, следует отметить, что описывать их можно как до main, так и после него.
Разберем функцию создания динамического массива:

Для начала нам следует создать одномерный массив указателей, затем в цикле в каждый указатель мы записываем еще одномерный массив, таким образом у нас выходит массив массивов, или, двумерный массив в котором n строк и m столбцов.

Так как мы работаем с динамическим массивом, то следует выделять память под него, это делается с помощью ключевого слова new.

Вторая функция, как и в статье №3, заполняет массив рандомными числами и выводит на экран. Заметьте, что в качестве параметра этой функции передается и сам массив.

Здесь подробно останавливаться не будем, так как рабочие моменты уже были пояснены в той самой насущной статье №3, поэтому сразу перейдем к main:

Создаем переменные строки и столбцы, далее просим пользователя ввести вручную значения для этих переменных(именно поэтому массив называется динамическим). После, вызываем наши функции: вызов осуществляется как имя функции + параметры в ()

И не лишним было бы освободить память по окончанию работы с динамическим массивом в C++

На этом сегодня все. Пишите свои комментарии, ваше мнение очень важно для нас!

Как передать двумерный динамический массив в функцию c

Как сделать передачу двумерного массива через параметр функции?

Либо создаёшь массив динамически:

Тогда можно написать функцию:

и использовать её прямо: f(arr);

Если же твой двумерный массив статический, то тебе обязательно нужно в объявлении функции указать одну (вторую) размерность:

Вот она, моя функция:

float det(float p[][], int n)

else add[х-1][y-1] = p[y][х];

det += p[i][0]*det(add, n-1))

Попытался перевести на указатели, получилось вот что:

float det(float **p, int n)

for(int i=0; int m=n>i; i++) <

float **add = new float*[n-1];

for(int i=0; i<n-1; i++) add[i] = new float[n-1];

else add[х-1][y-1] = p[y][х];

static float det;

det += p[i][0]*det(add, n-1); // вот здесь ошибка, не хочет вызываться [C++ Error] Call of nonfunction

А ещё можно ли как-нибудь за счёт параметра n указать сразу в параметре массива его размерность типа (n, m[n][n]).

void func(char mas[10][5]);

Ну, какие есть замечания:

1) Зачем тебе две переменных det — одна static, другая auto ??

2) Почему переменная det называется так же, как и функция? Или в латинском алфавите букв мало 😕 Тогда используй знак подчёркивания и цифры (цифры — не в начале). Компилятор, собственно, на это и ругается.

3) Если ты выделил память под переменную с помощью оператора new, то, когда она больше не нужна, освободи ресурс оператором delete. Пример

int* pa = new int;

Используй оператор delete[] для освобождения памяти для целого массива. Для двумерного массива это будет выглядеть так:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *