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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вывод файла http://www.cyberforum.ru/cpp-beginners/thread334387.html
Вообщем, кое-как сделал запись в файл. Теперь как бы вывести то, что уже записал? Неправильно программа работает. #include<iostream> #include<fstream> using namespace std; struct...
C++ Как убрать округления Вообщем есть набор чисел. Например: visual studio округляет число типа double - вместо 22995,56 пишет 22995,6. Как заставить её забыть про округление? http://www.cyberforum.ru/cpp-beginners/thread334370.html
C++ Решение Системы уравнений
У меня задача - решать систему уравнений. матрица системы имеет порядок 3600. В будущем придется решать системы порядка 100 000. Мне дана матрица коэффициентов. Дана она мне в необычном виде. ...
string C++
Почему не работает этот кусок проги ? #include "stdafx.h" #include <string.h> void main() { string s;
C++ СИ: одновременный вызов функции. библиотека. http://www.cyberforum.ru/cpp-beginners/thread334347.html
Трудно задать вопрос, когда не очень понятно, что нужно получить в ответ. Попробую так: Пусть есть некий my_lib.so/dll содержащий функцию foo(). Поскольку к foo() может произойти "одновременно"...
C++ Из символов в буквы Знаю один из методов защиты от переполнения массива. char str; cout<<"Введите строчку символов --> "; cin>>setw(40)>>str; } Мне надо проделать такую же защиту с типом данных подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
19.07.2011, 15:28
Цитата Сообщение от 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 (единица). Совершенно верно вычисляется произведение двух чисел!
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru