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

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

Войти
Регистрация
Восстановить пароль
 
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 445
#1

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

26.12.2011, 11:36. Просмотров 520. Ответов 2
Метки нет (Все метки)

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

Ошибка при динамическом выделении памяти - C++
Я не понимаю почему, но почему-то пример по динамическому выделению памяти, взятый с этой веб-страницы: http://cppstudio.com/post/9555/...

Ошибка при динамическом выделении памяти - C++
почему у меня возникет ошибка вот тут struct TOVAR *New = new struct TOVAR; пишит недопустимый неполный тип на struct подчеркивает...

Вопрос о динамическом выделении памяти - C++
Доброго времени суток всем. у меня вопрос к работе следующего кода: delete values; // Удаляем массив из кучи ...

Немного о динамическом выделении памяти ... - C++
объявление данных в классе: class Employee {.......... private: char *firstName; char *lasrName; }

Вопрос о динамическом выделении памяти для строки - C++
Как можно реализовать динамическое выделение для строки, т.е. например у меян есть указатель - char *c. Мне необходимо ввести строку с...

Создание исключения при динамическом выделении памяти - C++
Вот код из учебника в нем мне все понятно. #include&lt;iostream&gt; #include&lt;cstdlib&gt; //exit() #include&lt;new&gt; using std::cout;using...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
26.12.2011, 15:48 #2
Вам же нужно выделять память под указатели, а не под значения:
C++
1
*x=new float*[L1]; *X=new ShortComplex*[L1];
0
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 445
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 более жесткие по требованиям
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2011, 21:33
Привет! Вот еще темы с ответами:

Cin.getline() не работает при динамическом выделении памяти - C++
Почему в таком коде cin.getline() работает не так как надо? Если очистить поток, то будет все нормально. #include &lt;iostream&gt; using...

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

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

Ошибка при динамическом выделении двумерного массива char - C++
Ребята, спасите-помогите. Нужно выделить двумерный массив типа char для игрового поля. Выделяю вроде бы как положено, но получаю рантайм...


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

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

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