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

Нужно выделить память в куче - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
19.07.2011, 14:16     Нужно выделить память в куче #1
Работаю с довольно большим объемом данных, записанных матрицей. Для этого нужно выделить память в куче.
правильно ли я это делаю:
C++
1
2
int const range = 3000;
double **matrix = new *double[range];
В конце еще память освободить надо с помощью delete. Вот только все-равно ругается.
Помогите!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
19.07.2011, 14:30     Нужно выделить память в куче #2
покажи полностью код
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
19.07.2011, 14:37     Нужно выделить память в куче #3
C++
1
2
3
4
5
6
7
8
9
10
int const range = 3000;
// Выделяем
double **matrix = new double*[range];
for ( int i =0; i < range; i++)
  matrix[i] = new double[range];
 
// Освобождаем
for ( int i =0; i < range; i++)
  delete[] matrix[i];
delete[] matrix;
Так ? Просто освобожаем в обратном порядке.
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
19.07.2011, 14:43     Нужно выделить память в куче #4
C++
1
2
3
4
5
6
7
8
9
10
int const range = 3000;
// Выделяем
double **matrix = new double*[range];
for ( int i =0; i < range; i++)
  matrix[i] = new double[range];
 
// Освобождаем
for ( int i =0; i < range; i++)
  delete []matrix[i];
delete []matrix;
Цитата Сообщение от An1ka Посмотреть сообщение
Так! Просто освобожаем в обратном порядке.
Добавлено через 52 секунды
не забываем что выделяли под массив, вот и удаляем массив delete []matrix[i]
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
19.07.2011, 14:47     Нужно выделить память в куче #5
надо писать
= new double*[range];
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
19.07.2011, 14:50     Нужно выделить память в куче #6
Цитата Сообщение от OstapBender Посмотреть сообщение
надо писать
= new double*[range];
это где нужно писать ?
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
19.07.2011, 15:01     Нужно выделить память в куче #7
m1Rr0r, OstapBender имелл ввиду Вашу запись
Цитата Сообщение от hello19 Посмотреть сообщение
double **matrix = new *double[range];
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
19.07.2011, 15:01     Нужно выделить память в куче #8
hello19, а не проще ли использовать вектор векторов? Он за вас все и сделает сам.
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
19.07.2011, 15:03     Нужно выделить память в куче #9
ValeryLaptev,
может и проще, но явно для того чтобы понять что такое динамическая память, как ее выделять и с ней работать, лучше писать так как пишет автор.
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
19.07.2011, 15:07     Нужно выделить память в куче #10
к тому же, скорость работы с массивом быстрее, чем скорость работы с вектором... А так как объем данных, как пишет автор, большой, то уместно использовать именно массив...
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
19.07.2011, 15:28     Нужно выделить память в куче #11
Цитата Сообщение от Mиxaил Посмотреть сообщение
к тому же, скорость работы с массивом быстрее, чем скорость работы с вектором... А так как объем данных, как пишет автор, большой, то уместно использовать именно массив...
Не.
1. Скорость - такая же.
2. Объем - у меня больше. Размер матрицы 20000-20000 - все работает очень быстро, а гемора с памятю у меня нет.
3. Научиться работать с памятью - тогда вот вам ликбез:

Проблема решается так: сначала создается динамический массив указателей на массивы, затем каждый указатель инициализируется динамическим массивом для чисел. Таким образом, наш «главный» указатель является указателем на указатели. На С++ выделение памяти выглядит так:
C++
1
2
3
4
int n;              // размер матрицы
cout << «Введите размер матрицы: »; cin >> n;
float **m = new float *[n]; // массив указателей на строки матрицы
for(int i = 0; i < n; ++i) m[i] = new float[n]; // строки матрицы
Таким способом выделяется память для всех трех матриц. Потом исходные матрицы А и В заполняются значениями, и выполняется умножение по приведенной выше схеме. После выполнения работы полученную память необходимо вернуть системе, иначе возникает утечка памяти.
C++
1
for (i=0; i<n; i++) delete[] a[i]; delete[]a;
Сначала возвращаются массивы для чисел, а затем — массив указателей. Полная версия программы приведена в листинге 4.15.
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
Листинг 4.15. Умножение матриц — динамических массивов
int main (void)                 // главная программа
{ int i,j, n; 
   cout << "Введите размеры матриц А, B, R "; cin >> n;
// выделение памяти под матрицы
    float **a = new float*[n];  // указатель на матрицу А
    for(j = 0; j<n; j++) a[j]=new float [n];
    float **b = new float*[n];  // указатель на матрицу В
    for(j = 0; j<n; j++) b[j]=new float [n];              
    float **r = new float*[n];  // указатель на матрицу R         
    for(j = 0; j<n; j++) r[j]=new float [n];
// ввод матриц А и В
for (i=0; i<n; i++)
{ for (j=0; j<n; j++) cin >> a[i][j]; cout << endl; }  cout << endl;    
for (i=0; i<n; i++)
{ for (j=0; j<n; j++) cin >> b[i][j]; cout << endl; }  cout << endl;    
// умножение матриц
for (i=0; i<n; i++)
  for (j=0; j<n; j++)
  { float s=0; for (int k=0; k<n; k++) s+=a[i][k]*b[k][j]; r[i][j]=s; }
// вывод на экран матрицы-результата
cout << "Ответ" << endl;
for (i=0; i<n; i++)
  { for (j=0; j<n; j++) cout <<setw(6) << r[i][j]; cout << endl;  }
for (i=0; i<n; i++) delete[] a[i]; delete[]a;
for (i=0; i<n; i++) delete[] b[i]; delete[]b;
for (i=0; i<n; i++) delete[] r[i]; delete[]r;
return 0;
}
Интересно, что эта программа правильно работает даже при задании размера матриц, равного 1 (единица). Совершенно верно вычисляется произведение двух чисел!
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
19.07.2011, 17:19  [ТС]     Нужно выделить память в куче #12
Изначально я делал так: double matrix[range][range] = {0}; И дальше работал с этой матрицей.
Интересно, у меня там дальше вот такой кусок кода идет. Как он изменится?

Добавлено через 33 секунды
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
double b;
    vector <double> stringMatrix;
    ifstream fin2("2.txt");
    ofstream ofs3("3.txt");
    while ( fin2 >> b )
    {
        stringMatrix.push_back(b);
    }
 
    // Итоговая матрица коэфициентов
    int iter = 0;
    int string = 0;
    int column;
    while ( iter < stringMatrix.size() )
    {
        if ( stringMatrix[iter] != 0 )
        {
            column = stringMatrix[iter] - 1;
            matrix[string][column] = stringMatrix[iter+1];
            iter = iter + 2;
        } else 
        {
            if ( iter == stringMatrix.size() )
            {break;}
            else { iter++; string++; }
        }
    }
Добавлено через 1 час 0 минут
Вот так мы сделали динамический двумерный массив:
int const range = 3000;
double **matrix = new double*[range];
for ( int i =0; i < range; i++)
matrix[i] = new double[range];

А как его потом записать в виде матрицы в txt?
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
19.07.2011, 17:49     Нужно выделить память в куче #13
Цитата Сообщение от hello19 Посмотреть сообщение
А как его потом записать в виде матрицы в txt?
C++
1
2
3
4
5
6
7
ofstream ofs3("3.txt");
for ( int i =0; i < range; i++)
{
   copy ( matrix[i], matrix[i] + range, ostream_iterator< double>( ofs3, " "));
   ofs3.put('\n');
}
ofs3.close ();
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
20.07.2011, 10:49  [ТС]     Нужно выделить память в куче #14
C++
1
2
3
4
5
6
7
ofstream ofs3("3.txt");
for ( int i =0; i < range; i++)
{
   copy ( matrix[i], matrix[i] + range, ostream_iterator< double>( ofs3, " "));
   ofs3.put('\n');
}
ofs3.close ();
А это точно вывод матрицы?
А еще компилятор ругается вот на это: ostream_iterator< double>. Что делать?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.07.2011, 10:55     Нужно выделить память в куче #15
Цитата Сообщение от hello19 Посмотреть сообщение
А еще компилятор ругается вот на это: ostream_iterator< double>. Что делать?
C++
1
2
3
4
#include <iterator>
#include <algorithm>
 
using namespace std;
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
20.07.2011, 11:22  [ТС]     Нужно выделить память в куче #16
как заполнить новую кучу нулями? В итоге это должна быть нулевая матрица.
И как работать например с i-ой строчкой, j-столбцом?

C++
1
2
3
4
5
6
int const range = 5;
    double **matrix = new double*[range];
    for (int i = 0; i < range; i++) 
    {
        matrix[i] = new double[range];
    }
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
20.07.2011, 11:27     Нужно выделить память в куче #17
matrix[строка][столбец] = 0;
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
20.07.2011, 11:30     Нужно выделить память в куче #18
hello19, дык в моем примере выше написано ж все.
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
20.07.2011, 11:32  [ТС]     Нужно выделить память в куче #19
Можете прям написать код, где создается нулевая матрица?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2011, 11:33     Нужно выделить память в куче
Еще ссылки по теме:

Как выделить память? C++
Как выделить память для двумерного массива указателей в куче? C++
C++ Как выделяется память на стеке и на куче? Когда нужна ручная очистка?

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.07.2011, 11:33     Нужно выделить память в куче #20
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. Скорость - такая же.
Только при использовании operator[], который лучше и не использовать.)
Yandex
Объявления
20.07.2011, 11:33     Нужно выделить память в куче
Ответ Создать тему
Опции темы

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