Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с выделением памяти

32K
28 марта 2010 года
paska
26 / / 06.02.2009
Добрый день! у меня следующий вопрос. пишу программу де используются динамические массивы. и почему на первые два массива память выделяется нормально. а на 3-ем массиве программа выдает ошибку. Не могу понять в чем дело. В заранее спасибо.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
#include <iostream.h>


#define eps 0.0001

double func(double x, double y)
{
 return 6*sin(x)-(3+x)*y;
}
RK(double *res,double n,double h)
{
    int i;
    double k1,k2,k3,k4;
    double *x,*y;

     x = new double[n];
         y = new double[n];

    i = 0;
    x[0] =0; y[0]=0.1 ;
    while(i<n)
    {
      k1 = func(x,y);
      k2 = func(x+h/2,y+h/2*k1);
      k3 = func(x+h/2,y+h/2*k2);
      k4 = func(x+h/2,y+h/2*k3);
      y[i+1] = y+h/2*(k1+2*k2+2*k3+k4);
      res = func(x,y);
      x[i+1] = x+h;
      i++;

    } ;

    delete[] x;
    delete[] y;
    return *res;
}

DP()
{
 double res[1200],h=0.5;
 double n=1/h+1;
 double  *tmp,*tmp1;
 int i,j=0;



 m:
 RK(res,n,h);
 tmp = new double[n]; // ЗДЕСЬ НАЧИНАЕТ РУГАТЬСЯ
 tmp = res;
 for(i=0;i<n;i++){ printf("y'[%d] = %f\n",i,tmp);}
 h=h/2;
 printf("h = %f\n",h);
 n=1/h+1;
 RK(res,n,h);
 tmp1 = new double[n];
 tmp1 = res;
 for(i=0;i<n;i++){printf("y'[%d] = %f\n",i,tmp1);}



  bool f = false;
  for(j = 0; j<=n; j++)
  {
  if(abs(tmp[j]-tmp1[2*j]) <= 15*eps) {f = true;}
  else {f = false; break;  }
  }

  if( f == false )

    h=h/2;
    n=1/h;
    goto m;

}

main()
{
 DP();
 system("pause");
 return 0;
}
9.7K
28 марта 2010 года
oltzowwa
105 / / 15.02.2007
Код:
m:
 ...
 tmp = new double[n]; // ЗДЕСЬ НАЧИНАЕТ РУГАТЬСЯ
 ...
 tmp1 = new double[n];
 ...
  bool f = false;
  for(j = 0; j<=n; j++)
  {
  if(abs(tmp[j]-tmp1[2*j]) <= 15*eps) {f = true;}
  else {f = false; break;  }
  }

  if( f == false )

    h=h/2;
    n=1/h;
    goto m;

}


Совет: goto лучше не использовать. Можно обойтись без goto, используя цикл.
По коду программа никогда не остановится вычислять, так как
 
Код:
if( f == false )

    h=h/2;
    n=1/h;
    goto m;


Равносильно записи:
 
Код:
if( f == false )
{
    h=h/2;
}
    n=1/h;
    goto m;


Вы бесконечно выделяете память
 
Код:
tmp = new double[n]; // ЗДЕСЬ НАЧИНАЕТ РУГАТЬСЯ
 ...
 tmp1 = new double[n];
 ...

Но освобождать её не освобождаете, а теряете на каждой итерации.
307
28 марта 2010 года
Artem_3A
863 / / 11.04.2008
а слабо объяснить что это такое?
 
Код:
double n;
x = new double[n];


или типа ты собираешься выделить память под 3,8 элемента массива?
конечно, умный компилятор приведет тип и отбросит дробную часть, но все равно, что ты делаешь ты знать то должен!!!

а это вот что и как?

Код:
........

m:

........

  if( f == false )

    h=h/2;
    n=1/h;
    goto m;

........


сам то понял, что написал?
или ты считаешь, что скобки это лишнее?

и что такое это?

 
Код:
RK(double *res,double n,double h).......
DP()......


ты знаешь, что по умолчанию они возвращают тип инт?

Я конечно понимаю, все учатся, но черт возьми, с точки зрения эволюции у тебя немедленно просто необходимо отобрать компилятор! а еще лучше немедленно подвергнуть экзорцизму или аутодафе!
32K
28 марта 2010 года
paska
26 / / 06.02.2009
Я не совсем понял про бесконечное выделение памяти. ведь программа выдает ошибку на первом выделении памяти...
32K
28 марта 2010 года
paska
26 / / 06.02.2009
Цитата: oltzowwa
Код:
m:
 ...
 tmp = new double[n]; // ЗДЕСЬ НАЧИНАЕТ РУГАТЬСЯ
 ...
 tmp1 = new double[n];
 ...
  bool f = false;
  for(j = 0; j<=n; j++)
  {
  if(abs(tmp[j]-tmp1[2*j]) <= 15*eps) {f = true;}
  else {f = false; break;  }
  }

  if( f == false )

    h=h/2;
    n=1/h;
    goto m;

}


Совет: goto лучше не использовать. Можно обойтись без goto, используя цикл.
По коду программа никогда не остановится вычислять, так как
 
Код:
if( f == false )

    h=h/2;
    n=1/h;
    goto m;


Равносильно записи:
 
Код:
if( f == false )
{
    h=h/2;
}
    n=1/h;
    goto m;


Вы бесконечно выделяете память
 
Код:
tmp = new double[n]; // ЗДЕСЬ НАЧИНАЕТ РУГАТЬСЯ
 ...
 tmp1 = new double[n];
 ...

Но освобождать её не освобождаете, а теряете на каждой итерации.



сделал вот так но все равно ошибка:

Код:
DP()
{
 double res[1200],h=0.5;
 int n=1/h+1;
 double  *tmp,*tmp1;
 int i,j=0;
 bool f = false;

do{
 RK(res,n,h);
 tmp = new double[n];
 tmp = res;
 for(i=0;i<n;i++){ printf("y'[%d] = %f\n",i,tmp);}
 h=h/2;
 printf("h = %f\n",h);
 n=1/h+1;
 RK(res,n,h);
 tmp1 = new double[n];
 tmp1 = res;
 for(i=0;i<n;i++){printf("y'[%d] = %f\n",i,tmp1);}

  for(j = 0; j<=n; j++)
  {
  if(abs(tmp[j]-tmp1[2*j]) <= 15*eps) {f = true;}
  else {f = false; break;  }
  }
  delete[] tmp;  //освобождение памяти
  delete[] tmp1;
 }while(f==true);
}
9.7K
28 марта 2010 года
oltzowwa
105 / / 15.02.2007
Вылетает у тебя программа не на строке
 
Код:
tmp = new double[n];

а на строке
 
Код:
delete[] x;

функции RK(double *res,double n,double h).
Из-за того, что в x[i+1] = x+h; при i==2 x[3] ссылается неизвестно на какую память, так как массив у тебя размерности 3.
(С у-ком такая же ситуация)
32K
28 марта 2010 года
paska
26 / / 06.02.2009
спасибо! вроде бы разобрался...
9.7K
28 марта 2010 года
oltzowwa
105 / / 15.02.2007
Ещё ошибка:
 
Код:
RK(res,n,h);
 tmp = new double[n];
 tmp = res;


Та память, которая выделилась - потерялась при присваивании.

Лучше сделать:
 
Код:
tmp1 = new double[n];
 RK(tmp1,n,h);

Массив double res[1200] - не нужен.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог