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

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

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

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

09.11.2012, 11:23. Просмотров 1382. Ответов 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 строку. При компиляции ошибок нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2012, 11:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двухмерный динамический массив (C++):

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

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

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

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

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

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

38
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 11:50 #16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Я его не рассчитываю. Если операция выделения памяти заканчивается неудачей, оператор new возвращает 0.
Это мне вопрос был =)))

Добавлено через 41 секунду
Цитата Сообщение от АлексИванов Посмотреть сообщение
При ошибке на 13 строке, тормозиться, и не доходит до проверки.
Мы не телепаты. Что компилятор то пишет?
0
АлексИванов
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 выдавать ошибку.
0
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 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 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 12:01  [ТС] #19
Если дело не в памяти, и не в её ограничениях, то что тогда за ошибка такая?!
У меня уже голова кругом идет
0
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
09.11.2012, 12:04 #20
поставь брейкпойнты, и следи за каждым шагом выделения массива.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 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();
}
0
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
09.11.2012, 12:07 #22
Цитата Сообщение от АлексИванов Посмотреть сообщение
Если дело не в памяти, и не в её ограничениях, то что тогда за ошибка такая?!
тут вопрос возвращает new 0 или нет.
Если mas= new double*[w] равен нулю, то НИЧЕГО НЕ ВЫЛЕТИТ, однако
обращаться mas[i]= new уже будет нельзя в цикле
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:10 #23
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Если mas= new double*[w] равен нулю, то НИЧЕГО НЕ ВЫЛЕТИТ, однако
До проверки не доходит из-за throw
0
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
09.11.2012, 12:12 #24
Цитата Сообщение от Croessmah Посмотреть сообщение
До проверки не доходит из-за throw
не понял, где тут исключения? А главное, где тут throw. Я чего-то не понимаю? Разве сам по себе new должен выбрасывать куда-то?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:16 #25
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не понял, где тут исключения? А главное, где тут throw. Я чего-то не понимаю? Разве сам по себе new должен выбрасывать куда-то?
new выбрасывает исключение std::bad_alloc
0
АлексИванов
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 раза больше памяти или это не так?!
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:26 #27
Цитата Сообщение от АлексИванов Посмотреть сообщение
Похоже, что все таки дело в памяти, чтобы протестировать брейкпойнтом, ввёл данные где w=10000000, а h=100, после того как нажал выполнить программу, компьютер мой умер, всё зависло минут на 5.
Вам не хватает памяти, поэтому оператор new не может её выделить и кидает исключение.
Лично у меня это произошло, когда кончились 2Гб памяти, любезно предоставленные моей программе операционной системой
0
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
09.11.2012, 12:29 #28
Цитата Сообщение от АлексИванов Посмотреть сообщение
1 массив 100000 на 100000
Не, ёлки-палки, но какая задача может потребовать массив 100000 на 100000 на 8 байт типа дабл? Это же 8 гигабайт! Вы там менеджер памяти для Crysis 5 пишете?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 12:35 #29
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не, ёлки-палки, но какая задача может потребовать массив 100000 на 100000 на 8 байт типа дабл?
Смотрите первый пост.
Кликните здесь для просмотра всего текста
Мне нужно создать 4 многомерных динамических массивов, размерность которых 10000000 10000000

727 тб вроде
0
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
09.11.2012, 12:37 #30
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотрите первый пост.
в нём про задачу, требующую это не сказано
0
09.11.2012, 12:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 12:37
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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