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

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

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

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

09.11.2012, 11:23. Просмотров 1332. Ответов 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 В СЕРВЛЕТ , а не во время выполнения ,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 11:29 #2
Попробуйте массив поменьше сделать
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:32  [ТС] #4
Тут уже вопрос то не в размерах, я ещё даже размеры же не задаю, на форме только одна кнопка, и после нажатия ругается на саму процедуру не доходя до момента ввода каких либо данных и создания самого массива.
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 11:33 #5
Цитата Сообщение от АлексИванов Посмотреть сообщение
Мне нужно создать 4 многомерных динамических массивов, размерность которых 10000000 10000000

Не по теме:

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

0
АлексИванов
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 всё заработало, то как теперь задать массив намного больше?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:39  [ТС] #8
Можете поделиться как вы это рассчитываете?!
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
09.11.2012, 11:40 #9
Цитата Сообщение от АлексИванов Посмотреть сообщение
Можете поделиться как вы это рассчитываете?!

Не по теме:

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

Что рассчитываете?
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
09.11.2012, 11:42 #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Что рассчитываете?
Я так понял, что количество необходимой памяти
0
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 11:43  [ТС] #11
Да, количество необходимой памяти)
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 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)

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

Возможно это моё сообщение "Allocation mas[13] failure"?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 11:49
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.11.2012, 11:49
Ответ Создать тему
Опции темы

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