#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;
}
Проблемы с выделением памяти
Добрый день! у меня следующий вопрос. пишу программу де используются динамические массивы. и почему на первые два массива память выделяется нормально. а на 3-ем массиве программа выдает ошибку. Не могу понять в чем дело. В заранее спасибо.
Код:
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;
}
...
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;
h=h/2;
n=1/h;
goto m;
Равносильно записи:
Код:
if( f == false )
{
h=h/2;
}
n=1/h;
goto m;
{
h=h/2;
}
n=1/h;
goto m;
Вы бесконечно выделяете память
Код:
tmp = new double[n]; // ЗДЕСЬ НАЧИНАЕТ РУГАТЬСЯ
...
tmp1 = new double[n];
...
...
tmp1 = new double[n];
...
Но освобождать её не освобождаете, а теряете на каждой итерации.
Код:
double n;
x = new double[n];
x = new double[n];
или типа ты собираешься выделить память под 3,8 элемента массива?
конечно, умный компилятор приведет тип и отбросит дробную часть, но все равно, что ты делаешь ты знать то должен!!!
а это вот что и как?
Код:
........
m:
........
if( f == false )
h=h/2;
n=1/h;
goto m;
........
m:
........
if( f == false )
h=h/2;
n=1/h;
goto m;
........
сам то понял, что написал?
или ты считаешь, что скобки это лишнее?
и что такое это?
Код:
RK(double *res,double n,double h).......
DP()......
DP()......
ты знаешь, что по умолчанию они возвращают тип инт?
Я конечно понимаю, все учатся, но черт возьми, с точки зрения эволюции у тебя немедленно просто необходимо отобрать компилятор! а еще лучше немедленно подвергнуть экзорцизму или аутодафе!
Я не совсем понял про бесконечное выделение памяти. ведь программа выдает ошибку на первом выделении памяти...
Цитата: 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;
}
...
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;
h=h/2;
n=1/h;
goto m;
Равносильно записи:
Код:
if( f == false )
{
h=h/2;
}
n=1/h;
goto m;
{
h=h/2;
}
n=1/h;
goto m;
Вы бесконечно выделяете память
Код:
tmp = new double[n]; // ЗДЕСЬ НАЧИНАЕТ РУГАТЬСЯ
...
tmp1 = 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);
}
{
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);
}
Код:
tmp = new double[n];
а на строке
Код:
delete[] x;
функции RK(double *res,double n,double h).
Из-за того, что в x[i+1] = x+h; при i==2 x[3] ссылается неизвестно на какую память, так как массив у тебя размерности 3.
(С у-ком такая же ситуация)
спасибо! вроде бы разобрался...
Код:
RK(res,n,h);
tmp = new double[n];
tmp = res;
tmp = new double[n];
tmp = res;
Та память, которая выделилась - потерялась при присваивании.
Лучше сделать:
Код:
tmp1 = new double[n];
RK(tmp1,n,h);
RK(tmp1,n,h);
Массив double res[1200] - не нужен.