vc编程时一个很有趣的现象

vfeeok1 2010-12-16 10:31:50
首先先描述下我遇到的奇怪现象。问题出现在main函数里。
我调用zoep_P函数,再打印出来,该函数返回的是一个指针,指向一个一维数组,这个一维数组含有四个量。
现在问题出来了,该函数在第一次调用的时候,打印出来后三个量错误,均为0。第二次调用的时候就不会出现该现象。

但是,调试的时候确实两次调用zoep_P,它能够计算出来数值
***************************************************************************************************


#include "stdio.h"
#include "math.h"
#include "stdlib.h"

int gaus(a,b,n)
int n;
double a[],b[];
{ int *js,l,k,i,j,is,p,q;
double d,t;
js=malloc(n*sizeof(int));
l=1;
for (k=0;k<=n-2;k++)
{ d=0.0;
for (i=k;i<=n-1;i++)
for (j=k;j<=n-1;j++)
{t=fabs(a[i*n+j]);
if (t>d) { d=t; js[k]=j; is=i;}
}
if (d+1.0==1.0) l=0;
else
{ if (js[k]!=k)
for (i=0;i<=n-1;i++)
{ p=i*n+k; q=i*n+js[k];
t=a[p]; a[p]=a[q]; a[q]=t;
}
if (is!=k)
{ for (j=k;j<=n-1;j++)
{ p=k*n+j; q=is*n+j;
t=a[p]; a[p]=a[q]; a[q]=t;
}
t=b[k]; b[k]=b[is]; b[is]=t;
}
}
if (l==0)
{ free(js); printf("fail\n");
return(0);
}
d=a[k*n+k];
for (j=k+1;j<=n-1;j++)
{ p=k*n+j; a[p]=a[p]/d;}
b[k]=b[k]/d;
for (i=k+1;i<=n-1;i++)
{ for (j=k+1;j<=n-1;j++)
{ p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if (fabs(d)+1.0==1.0)
{ free(js); printf("fail\n");
return(0);
}
b[n-1]=b[n-1]/d;
for (i=n-2;i>=0;i--)
{ t=0.0;
for (j=i+1;j<=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
js[n-1]=n-1;
for (k=n-1;k>=0;k--)
if (js[k]!=k)
{ t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;}
free(js);
return(1);
}

double *zoep_P(float Pin,float Pout,float Sin,float Sout,float Roin,float Roout,double p)
{double A[4][4],B[4],*para;
A[0][0]=Pin*p;A[0][1]=sqrt(1-p*p*Sin*Sin);A[0][2]=-Pout*p;A[0][3]=sqrt(1-p*p*Sout*Sout);
A[1][0]=-sqrt(1-p*p*Pin*Pin);A[1][1]=Sin*p;A[1][2]=-sqrt(1-p*p*Pout*Pout);A[1][3]=-Sout*p;
A[2][0]=2*Sin*Sin*p*sqrt(1-p*p*Pin*Pin);A[2][1]=Sin*(1-2*Sin*Sin*p*p);A[2][2]=2*Roout/Roin*Sout*Sout*p*sqrt(1-p*p*Pout*Pout);A[2][3]=-Roout/Roin*Sout*(1-2*p*p*Sout*Sout);
A[3][0]=Pin*(1-2*p*p*Sin*Sin);A[3][1]=-2*Sin*Sin*p*sqrt(1-p*p*Sin*Sin);A[3][2]=-Roout/Roin*Pout*(1-2*p*p*Sout*Sout);A[3][3]=-2*Roout/Roin*Sout*Sout*p*sqrt(1-p*p*Sout*Sout);
B[0]=-Pin*p;B[1]=-sqrt(1-p*p*Pin*Pin);B[2]=2*Sin*Sin*p*sqrt(1-p*p*Pin*Pin);B[3]=-Pin*(1-2*p*p*Sin*Sin);
gaus(A,B,4);
para=B;
return para;
}


double *zoep_S(float Pin,float Pout,float Sin,float Sout,float Roin,float Roout,double p)
{double A[4][4],B[4],*para;
A[0][0]=Pin*p;A[0][1]=sqrt(1-p*p*Sin*Sin);A[0][2]=-Pout*p;A[0][3]=sqrt(1-p*p*Sout*Sout);
A[1][0]=-sqrt(1-p*p*Pin*Pin);A[1][1]=Sin*p;A[1][2]=-sqrt(1-p*p*Pout*Pout);A[1][3]=-Sout*p;
A[2][0]=2*Sin*Sin*p*sqrt(1-p*p*Pin*Pin);A[2][1]=Sin*(1-2*Sin*Sin*p*p);A[2][2]=2*Roout/Roin*Sout*Sout*p*sqrt(1-p*p*Pout*Pout);A[2][3]=-Roout/Roin*Sout*(1-2*p*p*Sout*Sout);
A[3][0]=Pin*(1-2*p*p*Sin*Sin);A[3][1]=-2*Sin*Sin*p*sqrt(1-p*p*Sin*Sin);A[3][2]=-Roout/Roin*Pout*(1-2*p*p*Sout*Sout);A[3][3]=-2*Roout/Roin*Sout*Sout*p*sqrt(1-p*p*Sout*Sout);
B[0]=sqrt(1-p*p*Sin*Sin);B[1]=-Sin*p;B[2]=-Sin*(1-2*Sin*Sin*p*p);B[3]=-2*Sin*Sin*p*sqrt(1-p*p*Sin*Sin);
gaus(A,B,4);
para=B;
return para;
}


main()
{double *temp;
int i;
temp=zoep_P(1000,1500,800,1300,1,1,0.00004994);
for(i=0;i<4;i++)
{printf("fwd[%d]=%lf \n ",i,*(temp+i));
}
temp=zoep_P(1500,1000,1300,800,1,1,0.00004994);
for(i=0;i<4;i++)
{printf("inv[%d]=%lf \n ",i,*(temp+i));
}
}


...全文
78 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
vfeeok1 2010-12-17
  • 打赏
  • 举报
回复
谢谢牛仔啊 在理论的指引下,问题很快就得到了解决。
eastcowboy 2010-12-17
  • 打赏
  • 举报
回复
不要返回指向局部变量、局部数组的指针。因为函数返回时,局部变量、局部数组都不复存在,所以指针也就没用了。
把这种指针返回出去,能用,那是运气好。不能用,那是正常情况。
vfeeok1 2010-12-16
  • 打赏
  • 举报
回复
能通过编译啊,*****下面是源代码。还请各位高手帮忙看看,我实在想不出问题出在哪里呢。很诡异。
prohibit 2010-12-16
  • 打赏
  • 举报
回复
这代码可以写的、到处都是星星**
sduxiaoxiang 2010-12-16
  • 打赏
  • 举报
回复
这代码能通过编译么

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧