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

Ошибка на динамическом выделении памяти - C++

Восстановить пароль Регистрация
 
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 405
26.12.2011, 11:36     Ошибка на динамическом выделении памяти #1
программа ниже безупречно выполнялась под С++Builder 6.0 (консольное приложение).
При переводе ее в VC6.0 (кроме сделанных исправлений - замена константы системной M_PI на
#define pi 3.14159 и устранеия цепляний компилятора к for(int i=0;i<..))
она стала давать сбой на динамическом выделении памяти .
C++
1
 *x=new float[L1]; *X=new ShortComplex[L1];
Вот исходник
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
 #include <stdio.h>
 #include <conio.h>
 #include <math.h>
#define pi 3.14159
struct ShortComplex
{ //для имитации комплексного числа (спектр)
 double re, im;
};
 
void dpf2(float **x,ShortComplex **X, int L1,int L2)
{//вычисление прямого дискретного преобразования Фурье
 //прямым методом. Число операций порядка N*N
  double t;
  for (int k1=0;k1<L1;k1++) {
    for (int k2=0;k2<L2;k2++)
       {
        X[k1][k2].re=0;X[k1][k2].im=0;
        for (int i=0;i<L1;i++)
           for (int j=0;j<L2;j++)  {
         t=2.*pi*i*k1/L1+2.*pi*j*k2/L2;
         X[k1][k2].re+=x[i][j]*cos(t); X[k1][k2].im+=x[i][j]*sin(t);
                                   }
       }
                        }
}
 
void testDPF()
{//формирует тестовый временной сигнал x[i][j]=i если i>L1/2,j>L2/2 для ДПФ
//и выполняет ДПФ, результат в массиве X
int L1,L2; //кол-во точек дискретизации по X и по Y
  printf("L1=?, L2=?\n");scanf("%i%i",&L1,&L2);
  float **x;  ShortComplex **X;
   *x=new float[L1]; *X=new ShortComplex[L1];//здесь ошибка
  for (int i=0;i<L1;i++)
    {x[i]=new float[L2]; X[i]=new ShortComplex[L2];}
  printf("x=\n");
  for (i=0;i<L1;i++)  {
    for (int j=0;j<L2;j++)
    {
     if (i>=L1/2. && j>=L2/2.)x[i][j]=1;
     else x[i][j]=0;
     printf("%6.3f ",x[i][j]);
    }
     printf("\n");
                          }
  dpf2(x,X,L1,L2);   printf("\nSpectr X\n");
  for ( i=0;i<L1;i++)     {
    for (int j=0;j<L2;j++)
     {printf("(%7.4f %7.4f) ",X[i][j].re,X[i][j].im);}
    printf("\n");
                             }
  for ( i=0;i<L1;i++)
     {delete x[i]; delete X[i];}
 delete[]x; delete []X;
}
int main()
{//главная программа -вызывает по выбору пользователя прямое или обратное преобразование
 //прямое для сигнала x[i]=i; //обратное для
  int n,ip;
  printf("2-mernoe DPF\n");
  printf("\n 1-iz faila,  2-test,  3- zapis test-faila    0- Vixod\n");
  scanf("%d*c",&ip);
  if (ip==2) testDPF();
   getch();
  return 0;
}
вот скриншот исключения кому надо
http://s11.***********/i183/1112/28/eaaddef2ff86.jpg
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2011, 11:36     Ошибка на динамическом выделении памяти
Посмотрите здесь:

C++ Вопрос о динамическом выделении памяти для строки
C++ Вопрос о динамическом выделении памяти
Немного о динамическом выделении памяти ... C++
Выравнивание при динамическом выделении памяти под массив C++
C++ Использование конструктора базового класса при динамическом выделении памяти
Создание исключения при динамическом выделении памяти C++
Ошибка при динамическом выделении двумерного массива char C++
Cin.getline() не работает при динамическом выделении памяти C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
26.12.2011, 15:48     Ошибка на динамическом выделении памяти #2
Вам же нужно выделять память под указатели, а не под значения:
C++
1
*x=new float*[L1]; *X=new ShortComplex*[L1];
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 405
26.12.2011, 21:33  [ТС]     Ошибка на динамическом выделении памяти #3
да понял. правильный вариант
C++
1
2
3
x=new float*[L1];//*x=new float*[L1];
for (int i=0;i<L1;i++)
    {x[i]=new float[L2];
Указанный вами вариант не компилируется в C++Builder 6
слева не должно быть * - вариант работает и под VC6.0 (студия 98) и под Builder
Самая хохма в том что под bcb6 работал и мой исходный "неправильный" по смыслу вариант и новый.
(правда exception вылетал при завершении проги)
А vc6.0, vc9.0 более жесткие по требованиям
Yandex
Объявления
26.12.2011, 21:33     Ошибка на динамическом выделении памяти
Ответ Создать тему
Опции темы

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