Форум программистов, компьютерный форум CyberForum.ru

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

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

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

17.12.2013, 09:56. Просмотров 591. Ответов 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];
    }
}
, то программа успешно откомпиллировалась, но при выполнении возникло необработанное исключение "нарушение прав доступа при записи".
Почему под одномерный массив получается так выделять память, а под массивы большей размерности - нет?
Может, я что-то не то передаю в функцию, в качестве аргументов?
Можно решить задачу стоящую передо мной как-то по-другому?
Буду признателен, если порекомендуете литературу по этому вопросу.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2013, 09:56     Как в отдельной функции выделить память для динамического массива, объявленного в main
Посмотрите здесь:

Выделить память для трёхмерного массива C++
выделить память для массива*[] C++
C++ Как выделить память для динамического массива?
C++ Как динамически выделить память для строкового массива?
Как выделить память для двумерного массива указателей в куче? C++
Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? C++
C++ Выделить память для трехмерного массива и изменить индексы начального элемента массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
17.12.2013, 10:01     Как в отдельной функции выделить память для динамического массива, объявленного в main #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
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 10:12  [ТС]     Как в отдельной функции выделить память для динамического массива, объявленного в main #3
Тогда ругается компиллятор. Может, что-то другое надо передавать в функцию выделения памяти в качестве аргумента?
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
17.12.2013, 10:16     Как в отдельной функции выделить память для динамического массива, объявленного в main #4
Я не знаю как это делается на С++, я так только на С делал, на С++ есть вектор и париться не надо. Причем, замечу, суть таже что на сях, что на плюсах.
zss
Модератор
Эксперт С++
6192 / 5795 / 1877
Регистрация: 18.12.2011
Сообщений: 14,805
Завершенные тесты: 1
17.12.2013, 10:44     Как в отдельной функции выделить память для динамического массива, объявленного в main #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++ )
Дима С
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 10:45  [ТС]     Как в отдельной функции выделить память для динамического массива, объявленного в main #6
Тогда компиллируется, а при выполнении выдаётся "Run-Time Check Failure #3 - The variable 'arr_2D' is being used without being initialized".
Получается, нельзя передавать не инициализированный массив?
А как инициализировать массив, не выделив память?
При моём необходимом условии выделения памяти в отдельной функции получается "circulus vitiosus"?
Но ведь одномерный случай работает.
zss
Модератор
Эксперт С++
6192 / 5795 / 1877
Регистрация: 18.12.2011
Сообщений: 14,805
Завершенные тесты: 1
17.12.2013, 10:49     Как в отдельной функции выделить память для динамического массива, объявленного в main #7
Цитата Сообщение от Дима С Посмотреть сообщение
а при выполнении выдаётся "Run-Time Check Failure #3 - The variable 'arr_2D' is being used without being initialized".
Я поправил эту ошибку. Замените код еще раз.
Дима С
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 11:02  [ТС]     Как в отдельной функции выделить память для динамического массива, объявленного в main #8
Цитата Сообщение от zss Посмотреть сообщение
Я поправил эту ошибку. Замените код еще раз.
Спасибо огромное. Не посоветуете, что надо почитать, чтобы самому мочь написать правильно?)
Тяжело у меня с пониманием этих звёздочек, скобочек и амперсандов.
zss
Модератор
Эксперт С++
6192 / 5795 / 1877
Регистрация: 18.12.2011
Сообщений: 14,805
Завершенные тесты: 1
17.12.2013, 11:08     Как в отдельной функции выделить память для динамического массива, объявленного в main #9
Да ничего читать не надо.
Запомните только, что операция &x - дает адрес переменной x
*x - дает значение, которое хранится по адресу x.
И еще надо не забывать, что при передаче параметра по значению
передается копия (поэтому мой первый предложенный вариант не сработал).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2013, 11:08     Как в отдельной функции выделить память для динамического массива, объявленного в main
Еще ссылки по теме:

C++ Создание динамического массива в отдельной функции
Память для динамического массива в классе C++
C++ Память для динамического массива структур
Как выделить память для двухмерного массива? C++
C++ В отдельной функции организовать подсчет суммы элементов динамического массива, которые удовлетворяют условию

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

Или воспользуйтесь поиском по форуму:
Дима С
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 15
17.12.2013, 11:08  [ТС]     Как в отдельной функции выделить память для динамического массива, объявленного в main #10
И чтобы я сам смог такой трёхмерный массив создать.
Yandex
Объявления
17.12.2013, 11:08     Как в отдельной функции выделить память для динамического массива, объявленного в main
Ответ Создать тему
Опции темы

Текущее время: 00:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru