Форум программистов, компьютерный форум 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
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 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
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 12:07     Двухмерный динамический массив #22
Цитата Сообщение от АлексИванов Посмотреть сообщение
Если дело не в памяти, и не в её ограничениях, то что тогда за ошибка такая?!
тут вопрос возвращает new 0 или нет.
Если mas= new double*[w] равен нулю, то НИЧЕГО НЕ ВЫЛЕТИТ, однако
обращаться mas[i]= new уже будет нельзя в цикле
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 12:10     Двухмерный динамический массив #23
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Если mas= new double*[w] равен нулю, то НИЧЕГО НЕ ВЫЛЕТИТ, однако
До проверки не доходит из-за throw
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 12:12     Двухмерный динамический массив #24
Цитата Сообщение от Croessmah Посмотреть сообщение
До проверки не доходит из-за throw
не понял, где тут исключения? А главное, где тут throw. Я чего-то не понимаю? Разве сам по себе new должен выбрасывать куда-то?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 12:26     Двухмерный динамический массив #27
Цитата Сообщение от АлексИванов Посмотреть сообщение
Похоже, что все таки дело в памяти, чтобы протестировать брейкпойнтом, ввёл данные где w=10000000, а h=100, после того как нажал выполнить программу, компьютер мой умер, всё зависло минут на 5.
Вам не хватает памяти, поэтому оператор new не может её выделить и кидает исключение.
Лично у меня это произошло, когда кончились 2Гб памяти, любезно предоставленные моей программе операционной системой
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 12:29     Двухмерный динамический массив #28
Цитата Сообщение от АлексИванов Посмотреть сообщение
1 массив 100000 на 100000
Не, ёлки-палки, но какая задача может потребовать массив 100000 на 100000 на 8 байт типа дабл? Это же 8 гигабайт! Вы там менеджер памяти для Crysis 5 пишете?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 12:35     Двухмерный динамический массив #29
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не, ёлки-палки, но какая задача может потребовать массив 100000 на 100000 на 8 байт типа дабл?
Смотрите первый пост.
Кликните здесь для просмотра всего текста
Мне нужно создать 4 многомерных динамических массивов, размерность которых 10000000 10000000

727 тб вроде
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 12:37     Двухмерный динамический массив #30
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотрите первый пост.
в нём про задачу, требующую это не сказано
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 12:38     Двухмерный динамический массив #31
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
в нём про задачу, требующую это не сказано
я про размер массива
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 12:42     Двухмерный динамический массив #32
Цитата Сообщение от Croessmah Посмотреть сообщение
я про размер массива
а я про задачу, требующую массив такого размера. Что-то мне подсказывает, что если автор не собирается сохранять в оперативе HD-фильмы, есть способ обойтись без таких обильных выделений.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 1
09.11.2012, 12:44     Двухмерный динамический массив #33
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а я про задачу, требующую массив такого размера. Что-то мне подсказывает, что если автор не собирается сохранять в оперативе HD-фильмы, есть способ обойтись без таких обильных выделений.
Я уже задавался этим вопросом в посте 12, но ответа не последовало =)
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
09.11.2012, 13:28     Двухмерный динамический массив #34
АлексИванов, здравствуйте. В Вашем случае тупо не хватает ни оперативной ни виртуальной памяти. Как написал Croessmah в #29 это порядка 728 Tb. Ответ на вопрос какую такую задачу вы решаете мы также не получили...
Как вариант можно предложить только использование разреженных массивов.
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 17:50  [ТС]     Двухмерный динамический массив #35
Цитата Сообщение от prZzZ Посмотреть сообщение
АлексИванов, здравствуйте. В Вашем случае тупо не хватает ни оперативной ни виртуальной памяти. Как написал Croessmah в #29 это порядка 728 Tb. Ответ на вопрос какую такую задачу вы решаете мы также не получили...
Как вариант можно предложить только использование разреженных массивов.
В новом посте двухмерный массив #3 описал условие задачи.

Добавлено через 50 секунд
Kuzia domovenok, В новом посте двухмерный массив #3 описал условие задачи.

Добавлено через 13 минут
Вообще у меня стоит задача такая:
Есть 3 уравнения, полученных по средством численного метода Эйлера, стохастические, дифференциальные с мультипликативным шумом,их нужно промоделировать, и построить разные графики такие как : оценку матожидания, оценку дисперсии, гистограмму плотности распределения случайной величины, двухмерную гистограмму, тоесть поверхность, и двухмерный фазовый портрет. Всё выше перечисленное относиться к области теории вероятности, методам Монте-Карло, и вычислительной математике.
3 уравнения записаны в явном виде, и для их реализации нужно смоделировать M=1000(чеб больше траекторий тем точнее решается задача) штук траекторий для каждого уравнения, где 1 траектория моделируется как правило на сетке от T=[0,100] с шагом h=0,0001(чем меньше шаг,тем более точно получается расчет).
Оценку матожидания, оценку дисперсии, гистограмму плотности распределения случайной величины я строить умею, и для реализации использовал одномерные массивы, но когда речь пошла о реализации двухмерного фазового портрета то тут я решил использовать двухмерные массивы.
Что такое двумерная плотность: Берется срез в произвольном узле например при T=70 и на каждой из 1000 траекторий запоминаются значения, например y1, аналогично запоминается значения переменной y2, и того получилось 1000 значений y1 и 1000 значений y2. Построение 2мерной плотности происходит следующим образом, ищется максимальное и минимальное значение y1 и y2, задается разбиение сетки например hag=100. рисуется сетка 100 на 100 с шагом (max-min)/hag. Далее берется первая траектория и соответствующая точка на ней (y1,y2) и смотрим в какой квадрат нашей сетки она попала, и двумерному массиву размер которого 100 на 100 соответствующим координатам присваиваем 1 count[i][j]=count[i][j]+1. В итоге в этом двумерном массиве хранятся количество попаданий точек (y1,y2) в соответствующий квадрат сетки, и получается 3х емрная поверхность.
Что такое двухмерный фазовый портрет: вот тут как раз нужно проделать примерно то же что и выше, разница только в том что выше учитывалась 1 точка на 1 траектории 1го уравнения, а здесь нужно запомнить все точки на 1 траектории, то есть после построения 1 траектории пар (y1,y2) будет 1000000, которые я как раз решил сохранять в двумерный массив, то есть для компоненты y1 один двумерный массив размер которого 1000000x1000, и аналогично для компоненты y2. далее так же идет перебор, нахождения min и max, задается количество разбиения и строиться 2мерный массив с количеством попаданий соответствующих пар (y1,y2) в построенную сетку.И получается трехмерная картинка.
Так как я не опытный программист, первое что пришло в голову всё это реализовывать с помощью двухмерного массива.О других способах ещё не думал, как обойтись без них.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
h=0.001;
 T=100;
 N= int(T/h);
 M=100;
 sigma=3;
 nach_y1=1;
 nach_y2=1;
 nach_y3=20;
 r=19;
 pi= 2*asin(1.0);
 hag=100;  //колличество интервалов разбиения для построения гистограммы
 hag1=50; //колличество интервалов разбиения для построения двухмерной гистограммы
           /*-----------------------------------------*/
 
 
 y1 =(double*)malloc(N*sizeof(double)); //Массив для расчета нужных функционалов
 y2 =(double*)malloc(N*sizeof(double)); //
 y3=(double*)malloc(N*sizeof(double));  //
 summ =(double*)malloc(N*sizeof(double));//Массив для вторых моментов
 x_x = (double*)malloc(N*sizeof(double));//Массив для расчета матожидания
 disper = (double*)malloc(N*sizeof(double));//Массив для расчета дисперсии
 gistogr = (double*)malloc(M*sizeof(double));// Массив для расчета гистограммы
 gistogr2 = (double*)malloc(M*sizeof(double));//Вспомогательный массив для расчета двумерной гистограммы
 gistogr2_1 = (double*)malloc(M*sizeof(double));//Вспомогательный массив для расчета двумерной гистограммы
 
 
   yy1 = new double*[N]; //Вспомогательный 2-мерный Массив N*M данных для расчета 2-мерного фазового портрета
    for(int k= 0; k < N; k++)
        yy1[k] = new double [M];
 
    yy3 = new double*[N];//
    for(int k= 0; k < N; k++)
        yy3[k] = new double [M];
 
    for (int i = 0; i < N; i++) //Обнуление массивов
        for (int k = 0; k <M ; k++)
        {
         yy1[i][k]=0;
         yy3[i][k]=0;
        }
 
    for (int i = 0; i < N; i++)//Обнуление массивов
         {
                y1[i]=0;
                y2[i]=0;
                y3[i]=0;
                summ[i]=0;
                x_x[i]=0;
         }
 
 
   for (int i = 0; i < M; i++)
   {
      gistogr[i]=0;
      gistogr2[i]=0;
      gistogr2_1[i]=0;
    }
 
     for (int k = 0; k < M; k++)//ВВод начальных условий в 2-мерные массивы
        {
         yy1[0][k]=nach_y1;
         yy3[0][k]=nach_y3;
        }
 
 
 for(int j = 1; j <= M; j++)//цыкл для моделирования M штук траекторий
          {
       y1[0] = nach_y1;
       y2[0] = nach_y2;
       y3[0] = nach_y3;
       x_x[0] = x_x[0]+y1[0]/M;
       summ[0]=summ[0]+(double)(y1[0]*y1[0])/M;
 
    for(int i=0; i<N; i++)//цыкл для моделирования 1 траектории
         {
 
     alfa1 = (double)rand()/(double)RAND_MAX;
        while(alfa1 == 0)
            alfa1 = (double)rand()/(double)RAND_MAX;
     alfa2 = (double)rand()/(double)RAND_MAX;
     ksi = sqrt(-2*log(alfa1))*sin(2*pi*alfa2);//моделирование гаусовской случайной величины
 
    y1[i+1] = y1[i]-h*10*(y1[i]-y2[i]);
    y2[i+1] = y2[i]+h*(-y2[i]-y1[i]*y3[i]+r*y1[i])+sigma*y1[i]*(sqrt(h))*ksi;
    y3[i+1] = y3[i]+h*(-(8/3)*y3[i]+y1[i]*y2[i]);
 
    x_x[i+1]=x_x[i+1]+y1[i+1]/M; //Расчитывается оценка математического ожидания
    summ[i+1]=summ[i+1]+(double)(y1[i+1]*y1[i+1])/M;//Расчитывается второй момент
 
     yy1[i][j]=y1[i+1]; //Заполнение вспомогательных массивов для построения 2-мерного фазового портрета
     yy3[i][j]=y3[i+1]; //
 
   }
     gistogr2[j-1]=y1[N-1];
     gistogr2_1[j-1]=y3[N-1];
   }
 
  /*---------------Начало построения дмумерной плотности---------------*/
     MIN=gistogr2[0];
   MAX=MIN;
   MIN1=gistogr2_1[0];
   MAX1=MIN1;
   for (int i=1; i <M; i++)
    {
        if (gistogr2[i]<MIN)
        {
             MIN=gistogr2[i];
        }
 
        if (gistogr2[i]>MAX)
        {
            MAX=gistogr2[i];
        }
 
        if (gistogr2_1[i]<MIN1)
        {
             MIN1=gistogr2_1[i];
        }
 
        if (gistogr2_1[i]>MAX1)
        {
            MAX1=gistogr2_1[i];
        }
    }
 
      a=MIN;
      b=MAX;
      a1=MIN1;
      b1=MAX1;
 
   double **count1;
 
    count1 = new double*[hag1];
    for(int k= 0; k < hag1; k++)
        count1[k] = new double [hag1];
 
      for (int i = 0; i < hag1; i++)
        for (int k = 0; k < hag1; k++)
        {
         count1[i][k]=0;
        }
 
      double const1,const2;
      const1=double((b-a)/hag1);
      const2=double((b1-a1)/hag1);
 
    double *setka2_0, *setka2_1;
    setka2_0=(double*)malloc(hag*sizeof(double));
    setka2_1=(double*)malloc(hag*sizeof(double));
    setka2_0[0]=a;
    setka2_1[0]=a1;
 
    for (int j = 0; j < hag1; j++)
    {
        setka2_0[j+1]=setka2_0[j]+const1;
        setka2_1[j+1]=setka2_1[j]+const2;
    }
 
     int X,Y;
     X=hag1;
     Y=hag1;
 
  for (int j=0; j < M; j++)
  {
   for (int i=0; i < X; i++)
     {
     if ((setka2_0[i]<=gistogr2[j]) && (gistogr2[j]<=setka2_0[i+1]))
         X=i;
     }
   for (int k=0; k < Y; k++)
     {
     if  ((setka2_1[k]<=gistogr2_1[j]) && (gistogr2_1[j]<=setka2_1[k+1]))
         Y=k;
     }
 
      count1[X][Y]= count1[X][Y]+1;
      X=hag1;
      Y=hag1;
 
   }
 
     FILE * SETKA2_0;
     FILE * SETKA2_1;
     SETKA2_0 = fopen("Сетка_для_построения_двухмерной_гистограммы_ось_абсцисс.txt","wt");
     SETKA2_1 = fopen("Сетка_для_построения_двухмерной_гистограммы_ось_ординат.txt","wt");
        for (int j = 0; j < hag1; j++)
        {
          fprintf( SETKA2_0, "%f " , setka2_0[j] );
          fprintf( SETKA2_1, "%f " , setka2_1[j] );
        }
     fclose(SETKA2_0);
     fclose(SETKA2_1);
 
 
 
    int peremennaya1;
    peremennaya1=0;
 
     FILE * MATRICA;
     MATRICA = fopen("Матрица_для_построения_двумерной_плотности.txt","wt");
 
 
     for (int i = 0; i < hag1; i++)
       {
        for (int k = 0; k < hag1; k++)
        {
          peremennaya1= count1[i][k];
          fprintf( MATRICA, "%d " , peremennaya1 );
        }
          fprintf( MATRICA, "\n");
       }
  fclose(MATRICA);
 
 /*----------Начало построения 2хмерного фазового портрета----------*/
 
   double *setka3_0, *setka3_1;
 double C,D,C1,D1;
 int hag2;
 double minn,maxx,minn1,maxx1;
   minn=yy1[0][0];
   maxx=minn;
   minn1=yy3[0][0];
   maxx1=minn1;
  for (int k = 1; k < M; k++)
  {
   for (int i=1; i <N; i++)
    {
        if (yy1[i][k]<minn)
        {
             minn=yy1[i][k];
        }
 
        if (yy1[i][k]>maxx)
        {
            maxx=yy1[i][k];
        }
 
        if (yy3[i][k]<minn1)
        {
             minn1=yy3[i][k];
        }
 
        if (yy3[i][k]>maxx1)
        {
            maxx1=yy3[i][k];
        }
    }
    }
 
  C=minn;
  D=maxx;
  C1=minn1;
  D1=maxx1;
 
 
   FILE * portret;
    portret = fopen ("FAZOVYI_Portret_MinMax.txt","wt");
    fprintf( portret, "%f " , C );
    fprintf( portret, "%f " , D );
  fclose(portret);
 
   FILE * portret1;
  portret1 = fopen("FAZOVYI_portet_Min1,Max1.txt","wt");
   fprintf( portret1, "%f " , C1);
     fprintf( portret1, "%f " , D1);
  fclose(portret);
 
  hag2=100;
   double **count2;
 
    count2 = new double*[hag2];
    for(int k= 0; k < hag; k++)
        count2[k] = new double [hag2];
 
      for (int i = 0; i < hag2; i++)
        for (int k = 0; k < hag2; k++)
        {
         count2[i][k]=0;
        }
 
      double const3,const4;
      const3=double((C-D)/hag2);
      const4=double((C1-D1)/hag2);
 
 
 
 
    setka3_0=(double*)malloc(hag2*sizeof(double));
    setka3_1=(double*)malloc(hag2*sizeof(double));
    setka3_0[0]=C;
    setka3_1[0]=C1;
 
    for (int j = 0; j < hag2; j++)
    {
        setka3_0[j+1]=setka3_0[j]+const1;
        setka3_1[j+1]=setka3_1[j]+const2;
 
    }
 
    int X2,Y2;
     X2=hag2;
     Y2=hag2;
 
  for (int o = 0; o < M; o++)
  {
     for (int j=0; j <N; j++)
     {
  for (int i=0; i < X2; i++)
     {
     if ((setka3_0[i]<=yy1[j][o]) && (yy1[j][o]<=setka3_0[i+1]))
         X2=i;
     }
  for (int k=0; k < Y2; k++)
     {
     if  ((setka3_1[k]<=yy3[j][o]) && (yy3[j][o]<=setka3_1[k+1]))
         Y2=k;
 
     }
 
      count2[X][Y]= count2[X][Y]+1;
      X2=hag2;
      Y2=hag2;
 
    }
     }
    int peremennaya2;
     peremennaya2=0;
 
     FILE * MATRICA1;
     MATRICA = fopen("FAZOVYI_PORTRET.txt","wt");
 
 
     for (int i = 0; i < hag2; i++)
       {
        for (int k = 0; k < hag2; k++)
        {
          peremennaya2= count2[i][k];
          fprintf( MATRICA1, "%d " , peremennaya2 );
        }
          fprintf( MATRICA1, "\n");
    }
  fclose(MATRICA1);
 
  for(int k= 0; k < N; k++)
      {
        delete [] yy1[k];
        delete [] yy3[k];
      }
        delete [] yy1;
        delete [] yy3;
  for(int k= 0; k < hag1; k++)
   {
    delete [] count1[k];
   }
    delete [] count1;
 
  for(int k= 0; k < hag2; k++)
   {
    delete [] count2[k];
   }
    delete [] count2;
Вот так выглядела моя программа до обращения на форум. Как же обойтись без использования столь больших массивов я пока не придумал.Опустил часть кода, где описываются переменные, и вычисляется простая однамерная гистограмма, дисперсия и матожидание, так как с этим нет проблем.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 18:23     Двухмерный динамический массив #36
с такими большими массивами информации никто не работает. Подгружай из файла/подзаписывай в файл по мере необходимости.
Но я не вижу такой необходимости! Ну создашь файл на N ТБ Что он тебе даст? Ты его на экран не отправишь, для построения графиков там понадобятся жалкие доли процента от количества тех точек, что ты насчитал. И то по 10 точек в одном пикселе монитора получишь. Искать решение уравнений, если я не ошибаюсь, можно и не сохраняя в памяти все промежуточные результаты, (но тут я не силён). Так с какой целью место на диске тратить?
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 18:32  [ТС]     Двухмерный динамический массив #37
Точно, я могу сначала все данные сразу сохранить в файлы, а потом считывать с 1 файла, и со второго файла, а потом уже полученную точку располагать в сетку. Но как обойтись без сеточного массива 100x100, куда сохраняются количество точек?!
И как считывать по 1 элементу из файла в котором будет храниться много элементов?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 18:50     Двухмерный динамический массив #38
Цитата Сообщение от АлексИванов Посмотреть сообщение
Но как обойтись без сеточного массива 100x100, куда сохраняются количество точек?!
Скажу по секрету, в Си вроде нет такого понятия как многомерный массив. Есть "массив массивов". Более того, память ПК линейна и расположить мы в ней массив можем, как сплошной одномерный массив, размером m*n, обращаясь к элементу a[i][j] как a[i*n+j]
Конечно, размер от того каким образом мы храним массив не меняется, но можно подгружать из файла, скажем лишь тот столбец, в который записываем элементы.

Например
C++
1
2
3
4
5
6
7
8
9
buffer=new int[n];//вспомогательный буфер
for (i=0; i<m; i++){
fseek(file, i*n, ...);//читаем i-ю строку
fread(buffer, ..., file);
for (j=0; j<n; j++){
buffer[j]=f(i, j);    //работаем только с ней
}
fwrite(...эээ не уверен как в середину файла писать...)//сохраняем назад (а лучше в новый файл)
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 18:57     Двухмерный динамический массив
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 18:57  [ТС]     Двухмерный динамический массив #39
Да тут в принципе можно 100 на 100 создать массив двумерный, на это памяти хватает, вот как считывать из файла ровно по 1 элементу?!
Например в файле хранятся числа 100 220 2,2131 3,12421
и как их считать по 1?
Yandex
Объявления
09.11.2012, 18:57     Двухмерный динамический массив
Ответ Создать тему
Опции темы

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