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

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

Войти
Регистрация
Восстановить пароль
 
Дима С
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
#1

Как в отдельной функции выделить память для динамического массива, объявленного в main - C++

17.12.2013, 09:56. Просмотров 842. Ответов 9
Метки нет (Все метки)

Доброго времени суток.
Передо мной стоит задача выделения памяти для динамического массива в отдельной функции.
То есть я объявляю в main динамический массив, вызываю функцию, его инициализирующую, потом уже в main с ним работаю.
Для одномерного массива получилось так:
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
void get_memory ( int size, double **a); // прототип функции для выделения памяти
 
#include "stdio.h"
#include <fstream>
 
using namespace std;
int main()
{
    double *arr;
    int M = 3;
    get_memory ( M , &arr ); // выделение памяти
    for ( int i = 0 ; i < M ; i++ ) 
    {
        arr[i] = i ; // Заполнение массива
    }
    ofstream out ("result.csv");
 
    for ( int i = 0 ; i < M ; i++ ) // вывод результатов
    {
        out << arr[i] << ",";
            out << "\n";
    }
    return 0;
}
 
void get_memory ( int size, double **a ) // вызов функции для выделения памяти
{
    *a = new double [size];
}
И это работает.
А вот когда я попробовал сделать для двумерного:
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
void get_memory_2D ( int M, int N, double ***arr_2D); // прототип функции для выделения памяти
 
#include "stdio.h"
#include <fstream>
 
using namespace std;
int main()
{
    double **arr_2D;
    int M = 3;
    int N = 3;
    get_memory_2D ( M, N, &arr_2D); // вызов функции для выделения памяти
    for ( int i = 0 ; i < M ; i++ )
    {
        for ( int j = 0 ; i < N ; j++ )
        {
            arr_2D[i][j] = i * ( j + 1 ); // Заполнение массива
        }
    }
    ofstream out ("result1.csv");
 
    for ( int i = 0 ; i < M ; i++ ) // вывод результатов
    {
        for ( int j = 0 ; i < N ; j++ )
        {
            out << arr_2D[i][j] << ",";
        }
        out << "\n";
    }
    return 0;
}
 
void get_memory_2D ( int M, int N, double ***arr_2D )
{
    **arr_2D = new double [M];
    for ( int i = 0 ; i < M ; i++ )
    {
    *arr_2D[i] = new double [N];
    }
}
, то программа успешно откомпиллировалась, но при выполнении возникло необработанное исключение "нарушение прав доступа при записи".
Почему под одномерный массив получается так выделять память, а под массивы большей размерности - нет?
Может, я что-то не то передаю в функцию, в качестве аргументов?
Можно решить задачу стоящую передо мной как-то по-другому?
Буду признателен, если порекомендуете литературу по этому вопросу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2013, 09:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как в отдельной функции выделить память для динамического массива, объявленного в main (C++):

Как выделить память для динамического массива? - C++
Как выделить память для динамического массива? typedef TPrimitives *TPrimitive; //... TPrimitives Primitives; Мне нужно выделить...

Создание динамического массива в отдельной функции - C++
Здравствуйте. Объясните пожалуйста, почему для создания динамического массива в функции мы должны передавать адресс массива, а при очистке...

В отдельной функции организовать подсчет суммы элементов динамического массива, которые удовлетворяют условию - C++
Составить программу, в которой сформировать прямоугольную таблицу С из n×m целых чисел в динамической памяти, в отдельной функции...

Как выделить память для двухмерного массива? - C++
Как выделить память для двухмерного массива в С++ a=new int???

Как динамически выделить память для строкового массива? - C++
Собственно сам вопрос.

Как выделить память для двумерного массива указателей в куче? - C++
Есть массив вида: unsigned char *ddtКак выделить память для такого массива в куче? Должен получиться двумерный массив указателей. Сами...

9
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
17.12.2013, 10:01 #2
Цитата Сообщение от Дима С Посмотреть сообщение
**arr_2D = new double [M];
* * for ( int i = 0 ; i < M ; i++ )
* * {
* * *arr_2D[i] = new double [N];
* * }
Не
C++
1
**arr_2D = new double [M];
а
C++
1
**arr_2D = new *double [M];
Выделять нужно не массив double а массив указателей на double (т.е. на массивы).
0
Дима С
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 10:12  [ТС] #3
Тогда ругается компиллятор. Может, что-то другое надо передавать в функцию выделения памяти в качестве аргумента?
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
17.12.2013, 10:16 #4
Я не знаю как это делается на С++, я так только на С делал, на С++ есть вектор и париться не надо. Причем, замечу, суть таже что на сях, что на плюсах.
0
zss
Модератор
Эксперт С++
6580 / 6142 / 2024
Регистрация: 18.12.2011
Сообщений: 16,010
Завершенные тесты: 1
17.12.2013, 10:44 #5
C++
1
2
3
4
5
6
7
8
void get_memory_2D ( int M, int N, double ***arr_2D )
{
    (*arr_2D) = new double* [M];
    for ( int i = 0 ; i < M ; i++ )
    {
     (*arr_2D)[i] = new double [N];
    }
}
Добавлено через 3 минуты
Еще внутренние циклы исправьте (у Вас написано i<N)
C++
1
for ( int j = 0 ; j < N ; j++ )
1
Дима С
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 10:45  [ТС] #6
Тогда компиллируется, а при выполнении выдаётся "Run-Time Check Failure #3 - The variable 'arr_2D' is being used without being initialized".
Получается, нельзя передавать не инициализированный массив?
А как инициализировать массив, не выделив память?
При моём необходимом условии выделения памяти в отдельной функции получается "circulus vitiosus"?
Но ведь одномерный случай работает.
0
zss
Модератор
Эксперт С++
6580 / 6142 / 2024
Регистрация: 18.12.2011
Сообщений: 16,010
Завершенные тесты: 1
17.12.2013, 10:49 #7
Цитата Сообщение от Дима С Посмотреть сообщение
а при выполнении выдаётся "Run-Time Check Failure #3 - The variable 'arr_2D' is being used without being initialized".
Я поправил эту ошибку. Замените код еще раз.
1
Дима С
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 11:02  [ТС] #8
Цитата Сообщение от zss Посмотреть сообщение
Я поправил эту ошибку. Замените код еще раз.
Спасибо огромное. Не посоветуете, что надо почитать, чтобы самому мочь написать правильно?)
Тяжело у меня с пониманием этих звёздочек, скобочек и амперсандов.
0
zss
Модератор
Эксперт С++
6580 / 6142 / 2024
Регистрация: 18.12.2011
Сообщений: 16,010
Завершенные тесты: 1
17.12.2013, 11:08 #9
Да ничего читать не надо.
Запомните только, что операция &x - дает адрес переменной x
*x - дает значение, которое хранится по адресу x.
И еще надо не забывать, что при передаче параметра по значению
передается копия (поэтому мой первый предложенный вариант не сработал).
0
Дима С
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 11:08  [ТС] #10
И чтобы я сам смог такой трёхмерный массив создать.
0
17.12.2013, 11:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2013, 11:08
Привет! Вот еще темы с ответами:

Память для динамического массива в классе - C++
Вариант 9. Создать класс MASS1, заданный последовательностью чисел. Реализовать следующие вычисления в виде методов класса: ...

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

выделить память для массива*[] - C++
привет. чего-то не получается организовать работу массива char *c; это динамический массив строк длиной 10 при конструкторе ...

Выделить память для трехмерного массива и изменить индексы начального элемента массива - C++
Выделить память для трехмерного массива а. Изменить индексы начального элемента массива на . Протестировать программу


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

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

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