求助:Unhandled exception in **.exe:0xC00000FD:Stack Overflow

jiangshare1 2008-10-13 09:18:55

double CSpaceResectionDlg::Function(double initXS,double initYS,double initZS,double initalfa,double initw,double initk)
{
UpdateData();

//initXS,initYS,initZS,initalfa,initw,initk的初始值
initXS=(m_nXA+m_nXB+m_nXC+m_nXD)/4;
initYS=(m_nYA+m_nYB+m_nYC+m_nYD)/4;
initZS= m_nf*(1/m_nscale);
initalfa=0.0;
initw=0.0;
initk=0.0;

//以下是书上的公式
double H = m_nf*(1/m_nscale);

double a1 = cos(initalfa)*cos(initk)-sin(initalfa)*sin(initw)*sin(initk);
double a2 = -cos(initalfa)*sin(initk)-sin(initalfa)*sin(initw)*cos(initk);
double a3 = -sin(initalfa)*cos(initw);

double b1 = cos(initw)*sin(initk);
double b2 = cos(initw)*cos(initk);
double b3 = -sin(initw);

double c1 = sin(initalfa)*cos(initk)+cos(initalfa)*sin(initw)*sin(initk);
double c2 = -sin(initalfa)*sin(initk)+cos(initalfa)*sin(initw)*sin(initk);
double c3 = cos(initalfa)*cos(initw);

double a11_1=1/(a3*(m_nXA-initXS)+b3*(m_nYA-initYS)+c3*(m_nZA-initZS))*(a1*m_nf+a3*m_nxa);
double a12_1=1/(a3*(m_nXA-initXS)+b3*(m_nYA-initYS)+c3*(m_nZA-initZS))*(b1*m_nf+b3*m_nxa);
double a13_1=1/(a3*(m_nXA-initXS)+b3*(m_nYA-initYS)+c3*(m_nZA-initZS))*(c1*m_nf+c3*m_nxa);
double a21_1=1/(a3*(m_nXA-initXS)+b3*(m_nYA-initYS)+c3*(m_nZA-initZS))*(a2*m_nf+a3*m_nxa);
double a22_1=1/(a3*(m_nXA-initXS)+b3*(m_nYA-initYS)+c3*(m_nZA-initZS))*(b2*m_nf+b3*m_nxa);
double a23_1=1/(a3*(m_nXA-initXS)+b3*(m_nYA-initYS)+c3*(m_nZA-initZS))*(c2*m_nf+c3*m_nxa);

double a14_1=m_nya*sin(initw)-(m_nxa/m_nf*(m_nxa*cos(initk)-m_nya*sin(initk))+m_nf*cos(initk))*cos(initw);
double a15_1=-m_nf*sin(initk)-m_nxa/m_nf*(m_nxa*sin(initk)+m_nya*cos(initk));
double a16_1=m_nya;
double a24_1=-m_nxa*sin(initw)-(m_nya/m_nf*(m_nxa*cos(initk)-m_nya*sin(initk))-m_nf*sin(initk))*cos(initw);
double a25_1=-m_nf*cos(initk)-m_nya/m_nf*(m_nxa*sin(initk)+m_nya*cos(initk));
double a26_1=-m_nxa;

double a11_2=1/(a3*(m_nXB-initXS)+b3*(m_nYB-initYS)+c3*(m_nZB-initZS))*(a1*m_nf+a3*m_nxb);
double a12_2=1/(a3*(m_nXB-initXS)+b3*(m_nYB-initYS)+c3*(m_nZB-initZS))*(b1*m_nf+b3*m_nxb);
double a13_2=1/(a3*(m_nXB-initXS)+b3*(m_nYB-initYS)+c3*(m_nZB-initZS))*(c1*m_nf+c3*m_nxb);
double a21_2=1/(a3*(m_nXB-initXS)+b3*(m_nYB-initYS)+c3*(m_nZB-initZS))*(a2*m_nf+a3*m_nxb);
double a22_2=1/(a3*(m_nXB-initXS)+b3*(m_nYB-initYS)+c3*(m_nZB-initZS))*(b2*m_nf+b3*m_nxb);
double a23_2=1/(a3*(m_nXB-initXS)+b3*(m_nYB-initYS)+c3*(m_nZB-initZS))*(c2*m_nf+c3*m_nxb);

double a14_2=m_nyb*sin(initw)-(m_nxb/m_nf*(m_nxb*cos(initk)-m_nyb*sin(initk))+m_nf*cos(initk))*cos(initw);
double a15_2=-m_nf*sin(initk)-m_nxb/m_nf*(m_nxb*sin(initk)+m_nyb*cos(initk));
double a16_2=m_nyb;
double a24_2=-m_nxb*sin(initw)-(m_nyb/m_nf*(m_nxb*cos(initk)-m_nyb*sin(initk))-m_nf*sin(initk))*cos(initw);
double a25_2=-m_nf*cos(initk)-m_nyb/m_nf*(m_nxb*sin(initk)+m_nyb*cos(initk));
double a26_2=-m_nxb;

double a11_3=1/(a3*(m_nXC-initXS)+b3*(m_nYC-initYS)+c3*(m_nZC-initZS))*(a1*m_nf+a3*m_nxc);
double a12_3=1/(a3*(m_nXC-initXS)+b3*(m_nYC-initYS)+c3*(m_nZC-initZS))*(b1*m_nf+b3*m_nxc);
double a13_3=1/(a3*(m_nXC-initXS)+b3*(m_nYC-initYS)+c3*(m_nZC-initZS))*(c1*m_nf+c3*m_nxc);
double a21_3=1/(a3*(m_nXC-initXS)+b3*(m_nYC-initYS)+c3*(m_nZC-initZS))*(a2*m_nf+a3*m_nxc);
double a22_3=1/(a3*(m_nXC-initXS)+b3*(m_nYC-initYS)+c3*(m_nZC-initZS))*(b2*m_nf+b3*m_nxc);
double a23_3=1/(a3*(m_nXC-initXS)+b3*(m_nYC-initYS)+c3*(m_nZC-initZS))*(c2*m_nf+c3*m_nxc);

double a14_3=m_nyc*sin(initw)-(m_nxc/m_nf*(m_nxc*cos(initk)-m_nyc*sin(initk))+m_nf*cos(initk))*cos(initw);
double a15_3=-m_nf*sin(initk)-m_nxc/m_nf*(m_nxc*sin(initk)+m_nyc*cos(initk));
double a16_3=m_nyc;
double a24_3=-m_nxc*sin(initw)-(m_nyc/m_nf*(m_nxc*cos(initk)-m_nyc*sin(initk))-m_nf*sin(initk))*cos(initw);
double a25_3=-m_nf*cos(initk)-m_nyc/m_nf*(m_nxc*sin(initk)+m_nyc*cos(initk));
double a26_3=-m_nxc;


double a11_4=1/(a3*(m_nXD-initXS)+b3*(m_nYD-initYS)+c3*(m_nZD-initZS))*(a1*m_nf+a3*m_nxd);
double a12_4=1/(a3*(m_nXD-initXS)+b3*(m_nYD-initYS)+c3*(m_nZD-initZS))*(b1*m_nf+b3*m_nxd);
double a13_4=1/(a3*(m_nXD-initXS)+b3*(m_nYD-initYS)+c3*(m_nZD-initZS))*(c1*m_nf+c3*m_nxd);
double a21_4=1/(a3*(m_nXD-initXS)+b3*(m_nYD-initYS)+c3*(m_nZD-initZS))*(a2*m_nf+a3*m_nxd);
double a22_4=1/(a3*(m_nXD-initXS)+b3*(m_nYD-initYS)+c3*(m_nZD-initZS))*(b2*m_nf+b3*m_nxd);
double a23_4=1/(a3*(m_nXD-initXS)+b3*(m_nYD-initYS)+c3*(m_nZD-initZS))*(c2*m_nf+c3*m_nxd);

double a14_4=m_nyd*sin(initw)-(m_nxd/m_nf*(m_nxd*cos(initk)-m_nyd*sin(initk))+m_nf*cos(initk))*cos(initw);
double a15_4=-m_nf*sin(initk)-m_nxd/m_nf*(m_nxd*sin(initk)+m_nyd*cos(initk));
double a16_4=m_nyd;
double a24_4=-m_nxd*sin(initw)-(m_nyd/m_nf*(m_nxd*cos(initk)-m_nyd*sin(initk))-m_nf*sin(initk))*cos(initw);
double a25_4=-m_nf*cos(initk)-m_nyd/m_nf*(m_nxd*sin(initk)+m_nyd*cos(initk));
double a26_4=-m_nxd;

//矩阵A
double A[8][6]=
{{a11_1,a12_1,a13_1,a14_1,a15_1,a16_1},
{a21_1,a22_1,a23_1,a24_1,a25_1,a26_1},
{a11_2,a12_2,a13_2,a14_2,a15_2,a16_2},
{a21_2,a22_2,a23_2,a24_2,a25_2,a26_2},
{a11_3,a12_3,a13_3,a14_3,a15_3,a16_3},
{a21_3,a22_3,a23_3,a24_3,a25_3,a26_3},
{a11_4,a12_4,a13_4,a14_4,a15_4,a16_4},
{a21_4,a22_4,a23_4,a24_4,a25_4,a26_4}};

//矩阵A的转置矩阵A_zhuan
double A_zhuan[6][8]=
{{a11_1,a21_1,a11_2,a21_2,a11_3,a21_3,a11_4,a21_4},
{a12_1,a22_1,a12_2,a22_2,a12_3,a22_3,a12_4,a22_4},
{a13_1,a23_1,a13_2,a23_2,a13_3,a23_3,a13_4,a23_4},
{a14_1,a24_1,a14_2,a24_2,a14_3,a24_3,a14_4,a24_4},
{a15_1,a25_1,a15_2,a25_2,a15_3,a25_3,a15_4,a25_4},
{a16_1,a26_1,a16_2,a26_2,a16_3,a26_3,a16_4,a26_4},
};


double opprox_xa = -m_nf*(m_nXA-initXS)/(m_nZA-initZS);
double opprox_ya = -m_nf*(m_nYA-initXS)/(m_nZA-initZS);

double opprox_xb = -m_nf*(m_nXB-initXS)/(m_nZB-initZS);
double opprox_yb = -m_nf*(m_nYB-initXS)/(m_nZB-initZS);

double opprox_xc = -m_nf*(m_nXC-initXS)/(m_nZC-initZS);
double opprox_yc = -m_nf*(m_nYC-initXS)/(m_nZC-initZS);

double opprox_xd = -m_nf*(m_nXD-initXS)/(m_nZD-initZS);
double opprox_yd = -m_nf*(m_nYD-initXS)/(m_nZD-initZS);



double l_xa = m_nxa-opprox_xa;
double l_ya = m_nya-opprox_ya;

double l_xb = m_nxb-opprox_xb;
double l_yb = m_nyb-opprox_yb;

double l_xc = m_nxc-opprox_xc;
double l_yc = m_nyc-opprox_yc;

double l_xd = m_nxd-opprox_xd;
double l_yd = m_nyd-opprox_yd;


//矩阵L
double L[8][1]={{l_xa},{l_ya},{l_xb},{l_yb},{l_xc},{l_yc},{l_xd},{l_yd}};


//为矩阵A,A_zhuan,L,B,C,X分配内存
A[100][100];
A_zhuan[100][100];
L[100][100];
double B[100][100];
double C[100][100];
double X[100][100];

brmul((double*)A_zhuan,(double*)A,6,8,6,(double*)B);
//矩阵A的转置矩阵乘以矩阵A,返回矩阵B
brinv((double*)B,6);
//矩阵B的逆
brmul((double*)B,(double*)A_zhuan,6,6,8,(double*)C);
//矩阵B的转置矩阵乘以矩阵A的转置矩阵,返回矩阵C
brmul((double*)C,(double*)L,6,8,1,(double*)X);
//矩阵C乘以矩阵L,返回矩阵X


//计算m_XS,m_YS,m_ZS,m_alfa,m_w,m_k
m_XS = initXS+X[0][0];

m_YS = initYS+X[1][0];

m_ZS = initZS+X[2][0];

m_alfa=initalfa+X[3][0];

m_w = initw+X[4][0];

m_k = initk+X[5][0];


//如果m_alfa或者m_w或者m_k的值大于0.1,
if((fabs(m_alfa)>=0.1)||(fabs(m_w)>=0.1)||(fabs(m_k)>=0.1))
{
initXS+=X[0][0];
initYS+=X[1][0];
initZS+=X[2][0];
initalfa+=X[3][0];
initw+=X[4][0];
initk+=X[5][0];
//递归
Function(initXS,initYS,initZS,initalfa,initw,initk);
return m_XS,m_YS,m_ZS,m_alfa,m_w,m_k;
}

else
return m_XS,m_YS,m_ZS,m_alfa,m_w,m_k;

UpdateData(false);
}
编译运行都没错,就是出不了结果
我用断点看了看,提示:
Unhandled exception in **.exe:0xC00000FD:Stack Overflow
求助~~~~
...全文
3401 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mexiao 2011-04-07
  • 打赏
  • 举报
回复
我调用DLL居然出现这个错误
kingrain213 2010-07-21
  • 打赏
  • 举报
回复
明白了,谢谢大家
Alt+F7
Link
Output
Stack allocations
Reserve 添写栈的空间大小(字节) 很好用
shoushui2009 2010-05-30
  • 打赏
  • 举报
回复
多谢,多谢!
laowang2 2008-11-28
  • 打赏
  • 举报
回复
upup
lizhigang34 2008-10-13
  • 打赏
  • 举报
回复
学习了,
多谢楼上几位高人的解释..
ddszhan 2008-10-13
  • 打赏
  • 举报
回复
Alt+F7
Link
Output
Stack allocations
Reserve 添写栈的空间大小(字节)
yjgx007 2008-10-13
  • 打赏
  • 举报
回复
典型的深度递归栈溢出,Function多次被递归调用,Function函数中定义了多个非常巨大的数组, 每次被向下递归调用,栈空间会累积增大不被自动释放,直到向上回朔返回。
函数变量定义是在栈上分配空间,默认是1MB,可以通过设定编译参数增加栈空间:
/stack:2048或更大.

问题出在:
double X[100][100]数组大约消耗了sizeof(double)*100*100 = 8*100*100 = 80,000字节
详细情况是:第一次调用Function时,在向下继续第二次递归调用Function,第三次..., 直到最后一次向上回朔返回,否则,X会始终
累积在每次递归调用的函数栈空间而不被释放。

解决方案:
用new或其它堆分配函数完成对X分配,计算完后不再使用时,也就是在下一次递归调用Function之前,用delete或堆释放函数将内存空间释放.
cnzdgs 2008-10-13
  • 打赏
  • 举报
回复
这个错误是“栈溢出”,每个线程的栈空间默认是1MB,局部变量(非静态)都在栈中分配,当使用的局部变量所需空间过多时,就会溢出。
你检查一下程序,看看哪些函数中定义了大数组,把大数组改成用new分配,函数返回前delete。例如double X[100][100];这个数组所占空间大约是80KB,最好改成用new分配,如果这样的数组个数不多,不改也没关系。
dirdirdir3 2008-10-13
  • 打赏
  • 举报
回复
调大stack的容量,或者把那些数组的变量改为用new在堆里分内存............

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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