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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
#1

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

09.11.2012, 11:23. Просмотров 1308. Ответов 38
Метки нет (Все метки)

Мне нужно создать 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 строку. При компиляции ошибок нет
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2012, 11:23     Двухмерный динамический массив
Посмотрите здесь:

Двухмерный динамический массив - C++
Создать двухмерный динамический массив, найти сумму значокь его элементов,вывести на экран,массив заполняется с клавиатуры.спасибо ...

Двухмерный динамический массив - C++
a=new int* for(int i=0;i&lt;m;i++) a=new int; Вот создание двухмерного динамического массива.Начеркал небольшой рисунок с...

двухмерный динамический массив - C++
задание было такое: Найти количество отрицательных и положительных элементов массива. Массив в памяти разместить динамически (с...

Динамический двухмерный массив - C++
ИМХО директива include предназначена для включения документа в тело JSP НА ЭТАПЕ ТРАНСЛЯЦИИ JSP В СЕРВЛЕТ , а не во время выполнения ,...

Динамический двухмерный массив - C++
Нужно сделать динамический двухмерный массив. 1. n столбиков и m строчек нужно задавать самому 2. массив должен записываться и...

Двухмерный динамический массив - C++
Ребята, подскажите пожалуйста, необходимо создать двухмерный динамический массив. Его размерность должна быть 10000000 на 10000000....

Двухмерный динамический массив строк - C++
Всем привет) Помогите пожалуйста создать двумерный динамический массив строк, почитал Подбельского, вроде сделала всё как по учебнику, но...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
Если дело не в памяти, и не в её ограничениях, то что тогда за ошибка такая?!
У меня уже голова кругом идет
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.11.2012, 12:04     Двухмерный динамический массив #20
поставь брейкпойнты, и следи за каждым шагом выделения массива.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:06     Двухмерный динамический массив #21
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Если просто не хватает памяти, вроде как ничего никуда вылетать не должно. Просто new вернёт NULL. Вылетит разве что если будешь записывать нечто в этот массив, не убедившись, что он не NULL
Дело в том, что 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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
double **allocate(long int w,long int h)
{
   double **mas;
    int j,i;
    try{
   mas= new double*[w];   
   if (!mas) {
      std::cerr<<"Allocation mas failure";
      system("pause");
      return NULL;
   }
    for(i=0; i<w; i++){
      mas[i]= new double [h];
      if (!mas[i]){
        std::cerr<<"Allocation mas["<<i<<"] failure";
        system("pause");
        return NULL;
      }
     
   }
    }
    catch(...){
        std::cerr<<"Allocation mas["<<i<<"] failure";
        for (j=0; j<i; j++) delete[] mas[j];
        delete[] mas; 
          return NULL;
    }
return mas;
}
 
int main(){
    const int w=100000;
    const int h=100000;
    double ** mass=0;
    mass=allocate(w,h);
 
    if(mass){
        for(int i=0;i<w;i++)
            delete [] mass[i];
        delete [] mass;
    }
    std::cin.get();
}
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.11.2012, 12:07     Двухмерный динамический массив #22
Цитата Сообщение от АлексИванов Посмотреть сообщение
Если дело не в памяти, и не в её ограничениях, то что тогда за ошибка такая?!
тут вопрос возвращает new 0 или нет.
Если mas= new double*[w] равен нулю, то НИЧЕГО НЕ ВЫЛЕТИТ, однако
обращаться mas[i]= new уже будет нельзя в цикле
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:10     Двухмерный динамический массив #23
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Если mas= new double*[w] равен нулю, то НИЧЕГО НЕ ВЫЛЕТИТ, однако
До проверки не доходит из-за throw
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.11.2012, 12:12     Двухмерный динамический массив #24
Цитата Сообщение от Croessmah Посмотреть сообщение
До проверки не доходит из-за throw
не понял, где тут исключения? А главное, где тут throw. Я чего-то не понимаю? Разве сам по себе new должен выбрасывать куда-то?
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:16     Двухмерный динамический массив #25
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не понял, где тут исключения? А главное, где тут throw. Я чего-то не понимаю? Разве сам по себе new должен выбрасывать куда-то?
new выбрасывает исключение std::bad_alloc
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 12:23  [ТС]     Двухмерный динамический массив #26
Похоже, что все таки дело в памяти, чтобы протестировать брейкпойнтом, ввёл данные где w=10000000, а h=100, после того как нажал выполнить программу, компьютер мой умер, всё зависло минут на 5.
Вечером ещё раз попробую, потому что сейчас нужно бежать.
И вопрос, а если у меня получилось создать 1 массив 100000 на 100000 без ошибок, то 2 массива уже не получиться создать такими большими?! то есть память 1 и если 1 массив её заполняет целиком то уже 2 массива требуют в 2 раза больше памяти или это не так?!
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:26     Двухмерный динамический массив #27
Цитата Сообщение от АлексИванов Посмотреть сообщение
Похоже, что все таки дело в памяти, чтобы протестировать брейкпойнтом, ввёл данные где w=10000000, а h=100, после того как нажал выполнить программу, компьютер мой умер, всё зависло минут на 5.
Вам не хватает памяти, поэтому оператор new не может её выделить и кидает исключение.
Лично у меня это произошло, когда кончились 2Гб памяти, любезно предоставленные моей программе операционной системой
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.11.2012, 12:29     Двухмерный динамический массив #28
Цитата Сообщение от АлексИванов Посмотреть сообщение
1 массив 100000 на 100000
Не, ёлки-палки, но какая задача может потребовать массив 100000 на 100000 на 8 байт типа дабл? Это же 8 гигабайт! Вы там менеджер памяти для Crysis 5 пишете?
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:35     Двухмерный динамический массив #29
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не, ёлки-палки, но какая задача может потребовать массив 100000 на 100000 на 8 байт типа дабл?
Смотрите первый пост.
Кликните здесь для просмотра всего текста
Мне нужно создать 4 многомерных динамических массивов, размерность которых 10000000 10000000

727 тб вроде
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 12:37     Двухмерный динамический массив
Еще ссылки по теме:

Указатель на двухмерный динамический массив - C++
Друзья, нужна Ваша помощь! Создаю одномерный динамический, создаю указатель на него (вернее на его первый эл-т). То же самое пытаюсь...

Тривиальная задача: двухмерный динамический массив - C++
задача простая: считать из файла размеры двухмерной матрицы, динамически ее создать, провести над ней операции, вывести в файл. Проблема в...

Динамический двухмерный массив (создать матрицу) - C++
Меня немного клинит, хочу уточнить. Задача заключается в том, чтобы создать двухмерный массив: матрицу размером 4 на 7 (4 строки, 7...

Создать двухмерный динамический массив строк - C++
Ввести 2-мерный массив. Количество строк и столбцов заранее неизвестно. Признаком конца ввода строки - ввод указанной пользователем...

Как правильней объявить динамический двухмерный массив - C++
Как правильней объявить динамический двухмерный массив и почему int (*p) = new int; //Или int **p = new int * ; for (int i =...


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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.11.2012, 12:37     Двухмерный динамический массив #30
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотрите первый пост.
в нём про задачу, требующую это не сказано
Yandex
Объявления
09.11.2012, 12:37     Двухмерный динамический массив
Ответ Создать тему
Опции темы

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