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

Двухмерный динамический массив - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:23     Двухмерный динамический массив #1
Мне нужно создать 4 многомерных динамических массивов, размерность которых 10000000 10000000, и у меня не получалось их создавать на столько большими, непосредственно в коде создавал все 4, потому что в среде Borland developer studio 2005 выдавало ошибку что то на подобии переполнения стека, тогда мне посоветовали их создать с помощью процедуры все сразу и использовать её при создании необходимого количества, ниже привел код.
Но теперь Borland developer studio 2005 сразу выдает ошибку на саму процедуру.
Помогите разобраться что не так в этом всём, может сам Borland developer studio 2005 касячит, и стоит использовать другую среду, или я может что то не понимаю и делаю не так
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
#include <vcl.h>
#include <iostream>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
 
double **allocate(long int w,long int h)
 {
  double **mas;
   mas= new double*[w];
   for(int i=0; i<w; i++)
    mas[i]= new double [h];
    
  return mas;
}
void destroy(int** array){
  delete[] array[0];
  delete[] array;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int m, n;
 
  double ** array;
 
  array=allocate(m, n);
  
  }
Так выглядит в Borland developer studio 2005 мой код, void __fastcall TForm1::Button1Click(TObject *Sender)- кнопка созданная на форме при нажатии которой должен создаться массив, но при нажатии вылезает ошибка "project.project1 .exe raised exception class::std_alloc with messag 'Exception Object Address 0x1E6B382' " И эта ошибка указывает на 21 строку. При компиляции ошибок нет
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,832
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 11:29     Двухмерный динамический массив #2
Попробуйте массив поменьше сделать
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 11:32     Двухмерный динамический массив #3
Цитата Сообщение от АлексИванов Посмотреть сообщение
void destroy(int** array){
delete[] array[0];
delete[] array;
}
это не совсем корректно, но ошибка не в этом

Добавлено через 1 минуту
Цитата Сообщение от АлексИванов Посмотреть сообщение
int m, n;
double ** array;
array=allocate(m, n);
А значения m, n вообще где задаются?
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:32  [ТС]     Двухмерный динамический массив #4
Тут уже вопрос то не в размерах, я ещё даже размеры же не задаю, на форме только одна кнопка, и после нажатия ругается на саму процедуру не доходя до момента ввода каких либо данных и создания самого массива.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,832
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 11:33     Двухмерный динамический массив #5
Цитата Сообщение от АлексИванов Посмотреть сообщение
Мне нужно создать 4 многомерных динамических массивов, размерность которых 10000000 10000000

Не по теме:

Посчитайте сколько Вам нужно памяти.
Если не ошибаюсь, около 40 Мб только на указатели, а про значения я вообще молчу

АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:37  [ТС]     Двухмерный динамический массив #6
Пока нигде, но как прочитал, исправил код.
C++
1
2
3
4
5
6
7
int m, n;
  m=10000;
  n=10000;
  int i, j;
  double ** array;
 
  array=allocate(m, n);
нет ошибок, но когда я увеличиваю m и n в 10 раз вылезает та же самая ошибка.
Но теперь даже если при массиве 10000 на 10000 всё заработало, то как теперь задать массив намного больше?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 11:38     Двухмерный динамический массив #7
Насчёт поменьше сделать. Если есть подозрение, что new не хватает памяти для выделения, нужно обязательно проводить проверку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
double **allocate(long int w,long int h)
{
   double **mas;
   mas= new double*[w];
   int j;
   if (!mas) {
      std::cerr<<"Allocation mas failure";
      system("pause");
      return NULL;
   }
    for(int i=0; i<w; i++){
      mas[i]= new double [h];
      if (!mas[i]){
        std::cerr<<"Allocation mas["<<i<<"] failure";
        system("pause");
        for (j=0; j<i; j++) delete[] mas[j];
        delete[] mas; 
        return NULL;
      }
 
   }
return mas;
}
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:39  [ТС]     Двухмерный динамический массив #8
Можете поделиться как вы это рассчитываете?!
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 11:40     Двухмерный динамический массив #9
Цитата Сообщение от АлексИванов Посмотреть сообщение
Можете поделиться как вы это рассчитываете?!

Не по теме:

ты рассчитываете

Что рассчитываете?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,832
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 11:42     Двухмерный динамический массив #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Что рассчитываете?
Я так понял, что количество необходимой памяти
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:43  [ТС]     Двухмерный динамический массив #11
Да, количество необходимой памяти)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,832
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 11:47     Двухмерный динамический массив #12
Цитата Сообщение от АлексИванов Посмотреть сообщение
Да, количество необходимой памяти)
Ну Вам нужно 10 000 000 указателей, указатель занимает 4 байта(в зависимости от архитектуры может отличаться), следовательно 10 000 000*4=40 000 000 байт делим на 1024, получаем в Кб, делим еще раз на 1024, получаем почти 40 Мб.
Со значениями так же. Тип double - 8 байт. Кол-во элементов m*h (10 000 000 * 10 000 000)

И что это такая за задача, которой необходимо столько памяти...
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 11:48     Двухмерный динамический массив #13
никто ничего не рассчитывает
Цитата Сообщение от АлексИванов Посмотреть сообщение
Да, количество необходимой памяти)
Я его не рассчитываю. Если операция выделения памяти заканчивается неудачей, оператор new возвращает 0.
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:48  [ТС]     Двухмерный динамический массив #14
Kuzia domovenok, При ошибке на 13 строке, тормозиться, и не доходит до проверки.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 11:49     Двухмерный динамический массив #15
Цитата Сообщение от АлексИванов Посмотреть сообщение
Kuzia domovenok, При ошибке на 13 строке, тормозиться, и не доходит до проверки.
Что за ошибка в 13й строке?

Возможно это моё сообщение "Allocation mas[13] failure"?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,832
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 11:50     Двухмерный динамический массив #16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Я его не рассчитываю. Если операция выделения памяти заканчивается неудачей, оператор new возвращает 0.
Это мне вопрос был =)))

Добавлено через 41 секунду
Цитата Сообщение от АлексИванов Посмотреть сообщение
При ошибке на 13 строке, тормозиться, и не доходит до проверки.
Мы не телепаты. Что компилятор то пишет?
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:58  [ТС]     Двухмерный динамический массив #17
project.project1 .exe raised exception class::std_alloc with messag 'Exception Object Address 0x1E6B382'
тут код получается по смыслу, сначала идет операция new, которая как я понял, создает указатели,а потом идет следом проверка. Так вот если 1я проверка проходит, но ошибка вылетает на 2м операторе new, у которого как мы думаем не хватает памяти, то до 2ой проверки уже не доходит.

Добавлено через 4 минуты
Нужно наверное создание с помощью new включить в оператор if, типа, если создается, то все нормально, else выдавать ошибку.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 11:58     Двухмерный динамический массив #18
Цитата Сообщение от АлексИванов Посмотреть сообщение
project.project1 .exe raised exception class::std_alloc with messag 'Exception Object Address 0x1E6B382'
тут код получается по смыслу, сначала идет операция new, которая как я понял, создает указатели,а потом идет следом проверка. Так вот если 1я проверка проходит, но ошибка вылетает на 2м операторе new, у которого как мы думаем не хватает памяти, то до 2ой проверки уже не доходит.
Если просто не хватает памяти, вроде как ничего никуда вылетать не должно. Просто new вернёт NULL. Вылетит разве что если будешь записывать нечто в этот массив, не убедившись, что он не NULL
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 12:01  [ТС]     Двухмерный динамический массив #19
Если дело не в памяти, и не в её ограничениях, то что тогда за ошибка такая?!
У меня уже голова кругом идет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 12:04     Двухмерный динамический массив
Еще ссылки по теме:

Двухмерный динамический массив C++
Динамический двухмерный массив C++
двухмерный динамический массив C++

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 12:04     Двухмерный динамический массив #20
поставь брейкпойнты, и следи за каждым шагом выделения массива.
Yandex
Объявления
09.11.2012, 12:04     Двухмерный динамический массив
Ответ Создать тему
Опции темы

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