Разобрать код программы и выявить ошибки - C (СИ)
Формулировка задачи:
Начал работать с С , немогу разобрать код, почему не работает?
Заранее спасибо, за помощь + к карме
int nlfm (float *uzxt, float *uml, float *a, float *uzx, float *wzx, float *tzx, float *gs, float *gu, float *gw, float *gt, int n, int lp)
{
/* u*df/dx + w*df/dz =sum {m,l} uzxt1{m,l}*fi{m,l}t;
lp=0 -- f=u; lp=1 -- f=w; lp=2 -- f= C(T);
uzxt1{m,l,2}=-1 :
fi (t)=exp(-uzxt1{m,l,4}*t)*(uzxt1{m,l,0}*sin(uzxt1{m,l,5}*t)+uzxt1{m,l,1}*cos(uzxt1{m,l,5}*t)
uzxt1{m,l,2}=1 :
fi (t)=(uzxt1{m,l,0}*exp(*(uzxt1{m,l,4}*t)+uzxt1{m,l,1}*exp(uzxt1{m,l,5}*t). */
int i, j, k, l, m, ml, mli, lnj, n1, n2, n3, n4, nl, nl1, k2, ki, k1, k3, j2, j3, l1, l2, lm, li, i2, lp1;
float *ay, *c, *d, *az, *nxt, *u0, *tzx0, *e, *f, r1, r2, r3, g1, g2, g3, g4, g5, ggu, c0;
ay=(float *)calloc(20,sizeof(float));
az=(float *)calloc(80,sizeof(float));
c=(float *)calloc(20,sizeof(float));
d=(float *)calloc(20,sizeof(float));
e=(float *)calloc(20,sizeof(float));
f=(float *)calloc(20,sizeof(float));
nxt=(float *)calloc(80,sizeof(float));
u0=(float *)calloc(80,sizeof(float));
tzx0=(float *)calloc(80,sizeof(float));
if ( tzx0!=NULL && u0!=NULL && c!=NULL && d!=NULL && e!=NULL && f!=NULL && nxt!=NULL && az!=NULL && ay!=NULL )
{
n3=n*n;
lp1=lp*n*n;
n4=n*n*n;
nl=4;
for (m=0;m<n;m++)
{ mli=m*n*n;
ml=8*m*n;
lm=m*n;
for (l=0;l<n;l++)
{ ggu=*(gs+lm+lp1+l);
lnj=l*n*n;
c0=0.;
for (n1=0;n1<nl;n1++)
{ k1=n1*n;
n2=6*n1;
for (l1=0;l1<nl;l1++)
{ l2=6*l1;
nl1=8*(n*n1+l1);
for (k=0;k<nl-1;k++)
{ k2=6*k;
k3=8*(n*n1+k);
ki=k*n;
for (j=0;j<nl-1;j++)
{ j2=6*j;
j3=8*(n*k+j);
if ( lp==0 )
{ r1=*(uml+k1+mli+l1)*(*(a+ki+lnj+j));
r2=*(uml+n4+k1+mli+l1)*(*(a+n4+ki+lnj+j));
for (i=0;i<8;i++)
{ *(c+i)=*(uzx+nl1+i);
*(d+i)=*(uzx+j3+i); }
/* printf("\n\t m=%u l=%u n1=%u l1=%u k=%u j=%u nl1=%u, j3=%u; r1=%8.3g, r2=%8.3g",m,l,n1,l1,k,j,nl1,j3,r1,r2); */
pftgt (e,c,d,0);
for (i=0;i<8;i++)
{ *(c+i)=*(wzx+nl1+i);
*(d+i)=*(uzx+j3+i); }
pftgt (ay,c,d,0);
for (i=0;i<3;i++)
{ *(e+i)*=r1;
*(ay+i)*=r2; }
for (i=0;i<6;i++) *(e+6+i)=*(ay+i);
pslf1(ay,e,2,3,0);
}
if ( lp==1 )
{ r1=*(uml+k1+mli+l1)*(*(a+ki+lnj+j));
r2=*(uml+n4+k1+mli+l1)*(*(a+n4+ki+lnj+j));
for (i=0;i<8;i++)
{ *(c+i)=*(uzx+nl1+i);
*(d+i)=*(wzx+j3+i); }
/* printf("\n\t m=%u l=%u n1=%u l1=%u k=%u j=%u nl1=%u, j3=%u; r1=%8.3g, r2=%8.3g",m,l,n1,l1,k,j,nl1,j3,r1,r2); */
pftgt (e,c,d,0);
for (i=0;i<8;i++)
{ *(c+i)=*(wzx+nl1+i);
*(d+i)=*(wzx+j3+i); }
pftgt (ay,c,d,0);
for (i=0;i<3;i++)
{ *(e+i)*=r1;
*(ay+i)*=r2; }
for (i=0;i<6;i++) *(e+6+i)=*(ay+i);
pslf1(ay,e,2,3,0);
}
if ( lp==2 )
{ r1=*(uml+k1+mli+l1)*(*(a+ki+lnj+j));
r2=*(uml+n4+k1+mli+l1)*(*(a+n4+ki+lnj+j));
for (i=0;i<8;i++)
{ *(c+i)=*(uzx+nl1+i);
*(d+i)=*(tzx+j3+i); }
/* printf("\n\t m=%u l=%u n1=%u l1=%u k=%u j=%u nl1=%u, j3=%u; r1=%8.3g, r2=%8.3g",m,l,n1,l1,k,j,nl1,j3,r1,r2); */
pftgt (e,c,d,0);
for (i=0;i<8;i++)
{ *(c+i)=*(wzx+nl1+i);
*(d+i)=*(tzx+j3+i); }
pftgt (ay,c,d,0);
for (i=0;i<3;i++)
{ *(e+i)*=r1;
*(ay+i)*=r2; }
for (i=0;i<6;i++) *(e+6+i)=*(ay+i);
pslf1(ay,e,2,3,0);
}
for (i=0;i<6;i++) *(az+j2+i)=*(ay+i);
} /* j */
/* printf("\n\t m=%u l=%u n1=%u l1=%u k=%u",m,l,n1,l1,k); */
pslf1(ay,az,nl-1,3,0);
for (i=0;i<6;i++) *(nxt+k2+i)=*(ay+i);
} /* k */
/* printf("\n\tm=%u l=%u n1=%u l1=%u ",m,l,n1,l1); */
pslf1(ay,nxt,nl-1,3,0);
for (i=0;i<6;i++) *(tzx0+l2+i)=*(ay+i);
} /* l1 */
/* printf("\n\tm=%u l=%u n1=%u n2=%u",m,l,n1,n2); */
pslf1(ay,tzx0,nl,3,0);
for (i=0;i<6;i++) *(u0+n2+i)=*(ay+i);
} /* n1 */
/* printf("\n\tm=%u l=%u",m,l); */
pslf1(ay,u0,nl,3,0);
*d=1;
*(d+1)=ggu;
yprv2 (ay,d,c,0,0);
if ( lp==0 ) r2=*(gu+lm+l);
if ( lp==1 )
{ r2=*(gw+lm+l);
c0=-r2; }
if ( lp==2 )
{ c0=*(gt+lm+l);
r2=*(gt+lm+n3+l); }
orig2 (d,c,0,0);
l2=8*l;
*(uzxt+ml+l2)=r2;
*(uzxt+ml+l2+1)=ggu;
*(d+2)+=c0;
for (j=0;j<6;j++) *(uzxt+ml+l2+j+2)=*(d+j);
/* orig3(d,ay,ggu,1); */
} /* l */
printf("\n\t uzxt1 -- array uzxt(ml=%u;%u,%u)\n",ml,m,n);
for (i=0;i<n;i++)
{ l2=8*i;
for (k=0;k<8;k++)
printf("%10.3g",*(uzxt+ml+l2+k)); PRN; }
PRN;
} /* m */
free(tzx0); free(u0);
free(nxt);
free(d); free(c);
free(f); free(e);
free(az);free(ay);
return(1);
}
else
{ printf("\n no memory for arrays in nlf1\n");
return(-1); }
}
float tmlk1 (float *slz, float *slx, float *gt, float t, float z, float x, int n)
{
/* TT^(1)(x,z,t)=TT^(0)(x,z,t)+
tt1_{4,m,l}+e^(tt1_{6,m,l}*t)*[tt1_{2,m,l}*sh(tt1_{7,m,l}*t)+tt2_{3,m,l}*ch(tt1_{7,m,l}*t)] */
int m, k, n1, mk;
float zz, xx, r1, r2, tts, ttx;
tts=0.;
n1=n+n;
for (m=0;m<n;m++)
{
zz=cos(*(slz+n1+m)*z);
ttx=0.;
for (k=0;k<n;k++)
{ mk=8*(m*n+k);
xx=cos(*(slx+k+n1)*x);
r2=*(gt+mk+4)+(*(gt+mk))*exp(-(*(gt+mk+1))*t);
if (*(gt+mk+5) == -1 )
r1=exp(*(gt+mk+6)*t)*(*(gt+mk+2)*sin(*(gt+mk+7)*t)+(*(gt+mk+3))*cos(*(gt+mk+7)*t));
else
r1=exp(*(gt+mk+6)*t)*(*(gt+mk+2)*sinh(*(gt+mk+7)*t)+(*(gt+mk+3))*cosh(*(gt+mk+7)*t));
/* r1=*(gt+mk+2)*exp(*(gt+mk+6)*t)+(*(gt+mk+3))*exp(*(gt+mk+7)*t); */
ttx+=(r1+r2)*xx;
}
tts+=ttx*zz;
}
return(tts);
}
float umlk1 (float *slz, float *slx, float *gt, float un, float t, float z, float x, int n)
{
/* UT^(1)(x,z,t)=ut_{0,m,l}+e^(ut_{3,m,l}*t)*[ut_{1,m,l}*sh(ut_{4,m,l}*t)+ut_{2,m,l}*ch(ut_{4,m,l}*t)] */
int m, l, k1, mk;
float zz, xx, r1, r2, uts, utx;
uts=0.;
for (m=0;m<n;m++)
{
zz=(sin(*(slz+m)*z)-(*(slz+m))/un*cos(*(slz+m)*z));
utx=0.;
for (l=0;l<n;l++)
{
mk=8*(l+m*n);
xx=sin(*(slx+l)*x);
r2=*(gt+mk+4)+(*(gt+mk))*exp(-(*(gt+mk+1))*t);
if (*(gt+mk+5) == -1 )
r1=exp(*(gt+mk+6)*t)*(*(gt+mk+2)*sin(*(gt+mk+7)*t)+(*(gt+mk+3))*cos(*(gt+mk+7)*t));
else
r1=exp(*(gt+mk+6)*t)*(*(gt+mk+2)*sinh(*(gt+mk+7)*t)+(*(gt+mk+3))*cosh(*(gt+mk+7)*t));
/* r1=*(gt+mk+2)*exp(*(gt+mk+6)*t)+(*(gt+mk+3))*exp(*(gt+mk+7)*t); */
utx+=xx*(r1+r2);
}
uts+=zz*utx;
}
return(uts);
}
float wmlk1 (float *slz, float *slx, float *gt, float t, float z, float x, int n)
{
/* w^(1)(x,z,t) */
int m, k, l, mk;
float zz, xx, r1, r2, tts, ttx;
tts=0.;
for (m=0; m<n; m++)
{ zz=cos(*(slz+n+m)*z);
ttx=0.;
for (l=0;l<n;l++)
{
mk=8*(l+m*n);
xx=cos(*(slx+l+n)*x);
r2=*(gt+mk+4)+(*(gt+mk))*exp(-(*(gt+mk+1))*t);
if (*(gt+mk+5) == -1 )
r1=exp(*(gt+mk+6)*t)*(*(gt+mk+2)*sin(*(gt+mk+7)*t)+(*(gt+mk+3))*cos(*(gt+mk+7)*t));
else
r1=exp(*(gt+mk+6)*t)*(*(gt+mk+2)*sinh(*(gt+mk+7)*t)+(*(gt+mk+3))*cosh(*(gt+mk+7)*t));
/* r1=*(gt+mk+2)*exp(*(gt+mk+6)*t)+(*(gt+mk+3))*exp(*(gt+mk+7)*t); */
ttx+=xx*(r1+r2);
}
tts+=ttx*zz;
}
return(tts);
}
int grf0mlk (float *slz, float *slx, float *ut, float *gs, float *u, int n, int lp)
{
FILE *fcl;
int i, k, l, m, l1, l2, n2, nz;
float t, x, z, un, dt, dx, dz, *umlk;
nz=2*n;
n2=nz*nz;
un=*(u+10);
umlk=(float *)calloc(n2+1,sizeof(float));
if ( umlk!=NULL )
{
dx=*u/nz;
dz=*(u+1)/nz;
t=1.;
z=0;
dt=0.2;
for (l=0;l<nz;l++)
{ l2=l*nz;
x=0.;
for (k=0;k<nz;k++)
{ if ( lp==0 ) *(umlk+l2+k)=umlk0 (slz, slx, ut, gs, un, t, z, x, n);
if ( lp==1 ) *(umlk+l2+k)=wmlk0 (slz, slx, ut, gs, t, z, x, n);
if ( lp==2 ) *(umlk+l2+k)=tmlk0 (slz, slx, ut, gs, t, z, x, n);
x=x+dx;
}
z=z+dz;
}
printf("\n\t umlk0(z,x,t=%5.2f) lp=%u; dx=%7.3g, dz=%7.3g dt=%5.2g -- array uzx1(%u,%u)\n",t,lp,dx,dz,dt,nz,nz);
for (l=0;l<nz;l++)
{ l2=l*nz;
for (k=0;k<nz;k++)
printf("%8.3g%c",*(umlk+l2+k), ( k%n==n-1 ) ? '\n' : ' ');
PRN; }
if ( lp==0 ) fcl = fopen("gduzx0.dat","w");
if ( lp==1 ) fcl = fopen("gdwzx0.dat","w");
if ( lp==2 ) fcl = fopen("gdtzx0.dat","w");
for (i=0; i<n2; i++) fprintf(fcl,"%g,",*(umlk+i));
fclose(fcl);
x=2.;
z=0.;
for (m=0;m<nz;m++)
{ t=0;
n2=m*n;
l2=m*nz;
for (l=0;l<nz;l++)
{ if ( lp==0 ) *(umlk+l2+l)=umlk0 (slz, slx, ut, gs, un, t, z, x, n);
if ( lp==1 ) *(umlk+l2+l)=wmlk0 (slz, slx, ut, gs, t, z, x, n);
if ( lp==2 ) *(umlk+l2+l)=tmlk0 (slz, slx, ut, gs, t, z, x, n);
t=t+dt;
}
z=z+dz;
}
printf("\n\t uml0(z,x=%5.2f,t) lp=%u -- array uml0(%u,%u)\n",x,lp,nz,nz);
for (m=0; m<nz; m++)
{ n2=m*nz;
for (l=0; l<nz; l++)
printf("%8.3g%c",*(umlk+n2+l), ( l%n==n-1 ) ? '\n' : ' ');
PRN;
}
if ( lp==0 ) fcl = fopen("gduzt0.dat","w");
if ( lp==1 ) fcl = fopen("gdwzt0.dat","w");
if ( lp==2 ) fcl = fopen("gdtzt0.dat","w");
for (i=0; i<n2; i++) fprintf(fcl,"%g,",*(umlk+i));
fclose(fcl);
z=2.;
x=0.5;
for (m=0;m<nz;m++)
{ t=0;
n2=m*n;
l2=m*nz;
for (l=0;l<nz;l++)
{ if ( lp==0 ) *(umlk+l2+l)=umlk0 (slz, slx, ut, gs, un, t, z, x, n);
if ( lp==1 ) *(umlk+l2+l)=wmlk0 (slz, slx, ut, gs, t, z, x, n);
if ( lp==2 ) *(umlk+l2+l)=tmlk0 (slz, slx, ut, gs, t, z, x, n);
t=t+dt;
}
x=x+dx;
}
printf("\n\t uml0(x,t,z=%5.2f) lp=%u -- array uml0(%u,%u)\n",z,lp,nz,nz);
for (m=0; m<nz; m++)
{ n2=m*nz;
for (l=0; l<nz; l++)
printf("%8.3g%c",*(umlk+n2+l), ( l%n==n-1 ) ? '\n' : ' ');
PRN;
}
if ( lp==0 ) fcl = fopen("gduxt0.dat","w");
if ( lp==1 ) fcl = fopen("gdwxt0.dat","w");
if ( lp==2 ) fcl = fopen("gdtxt0.dat","w");
for (i=0; i<n2; i++) fprintf(fcl,"%g,",*(umlk+i));
fclose(fcl);
free(umlk);
return(1);
}
else
{ printf("\n no memory for umlk in grf0mlk\n");
return(-1); }
}
int grfmlk (float *slz, float *slx, float *ut, float *u, int n, int lp)
{
FILE *fcl;
int i, k, l, m, l1, l2, n2, nz;
float t, x, z, un, dt, dx, dz, *umlk;
nz=2*n;
n2=nz*nz;
un=*(u+10);
umlk=(float *)calloc(n2+1,sizeof(float));
if ( umlk!=NULL )
{
/* printf("\n\t array ut(%u,%u,8)\n",n,n);
for (m=0; m<n; m++)
{ n2=8*m*n;
for (l=0; l<n; l++)
{ l2=8*l;
for (i=0;i<8;i++) printf("%10.3g",*(ut+n2+l2+i));
PRN; }
}
... дополненияРешение задачи: «Разобрать код программы и выявить ошибки»
textual
Листинг программы
float tmlk1 (float *slz, float *slx, float *gt, float t, float z, float x, int n); float umlk1 (float *slz, float *slx, float *gt, float un, float t, float z, float x, int n); float wmlk1 (float *slz, float *slx, float *gt, float t, float z, float x, int n); int grf0mlk (float *slz, float *slx, float *ut, float *gs, float *u, int n, int lp); int grfmlk (float *slz, float *slx, float *ut, float *u, int n, int lp);