【求助】程序运行异常,找不到错误位置

claire_zhaoj 2013-05-06 09:35:00
程序运行错误显示为
不太理解,求指导
	double R[9];
double U=0.0,V=0.0,W=0.0;
double *L=new double[8];
double *A=new double[8*6];
double *AT=new double[];
double *N=new double[];
double *ATL=new double[];
double *K=new double[];
do{
//旋转矩阵R
R[0]=cos(fi)*cos(kappa)-sin(fi)*sin(omega)*sin(kappa);
R[1]=-cos(fi)*sin(kappa)-sin(fi)*sin(omega)*cos(kappa);
R[2]=-sin(fi)*cos(omega);
R[3]=cos(omega)*sin(kappa);
R[4]=cos(omega)*cos(kappa);
R[5]=-sin(omega);
R[6]=sin(fi)*cos(kappa)+cos(fi)*sin(omega)*sin(kappa);
R[7]=-sin(fi)*sin(kappa)+cos(fi)*sin(omega)*cos(kappa);
R[8]=cos(fi)*cos(omega);
for(i=0;i<number;i++)
{
//辅助参数计算
U=R[0]*(X[i]-XS)+R[3]*(Y[i]-YS)+R[6]*(Z[i]-ZS);
V=R[1]*(X[i]-XS)+R[4]*(Y[i]-YS)+R[7]*(Z[i]-ZS);
W=R[2]*(X[i]-XS)+R[5]*(Y[i]-YS)+R[8]*(Z[i]-ZS);
//常数项
L[2*i]=ximage[i]+f*U/W;
L[2*i+1]=yimage[i]+f*V/W;
//误差方程系数阵
A[2*6*i+0]=(R[0]*f+R[2]*x)/W;
A[2*6*i+1]=(R[3]*f+R[5]*x)/W;
A[2*6*i+2]=(R[6]*f+R[8]*x)/W;
A[2*6*i+3]=y*sin(omega)-cos(omega)*(x*(x*cos(kappa)-y*sin(kappa))/f+f*cos(kappa));
A[2*6*i+4]=-f*sin(kappa)-x*(x*sin(kappa)+y*cos(kappa))/f;
A[2*6*i+5]=y;

A[2*6*i+6+0]=(R[1]*f+R[2]*x)/W;
A[2*6*i+6+1]=(R[4]*f+R[5]*x)/W;
A[2*6*i+6+2]=(R[7]*f+R[8]*x)/W;
A[2*6*i+6+3]=-x*sin(omega)-(y*(x*cos(kappa)-y*sin(kappa))/f-f*sin(kappa))*cos(omega);
A[2*6*i+6+4]=-f*cos(kappa)-y*(x*sin(kappa)+y*cos(kappa))/f;
A[2*6*i+6+5]=-x;
}
//解法方程
rm.MatrixTranpose(A,AT,8,6);
rm.MatrixMul(AT,A,N,6,8,6);
rm.invers_matrix(N,6);
rm.MatrixMul(N,AT,K,6,6,8);
rm.MatrixMul(K,L,XX,6,8,1);
//
XS+=XX[0];
YS+=XX[1];
ZS+=XX[2];
fi+=XX[3];
omega+=XX[4];
kappa+=XX[5];
count++;
}
while(XX[3]>(0.1/60*3.14159265354/180)&&XX[4]>(0.1/60*3.14159265354/180)&&XX[5]>(0.1/60*3.14159265354/180));
delete[] L;
delete[] A;
delete[] AT;
delete[] ATL;
delete[] N;
delete[] K;

#include "stdafx.h"
#include "example.h"
#include "matrix.h"
#include "ModalDlg.h"
#include "math.h"

#include "malloc.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

matrix::matrix()
{
}

matrix::~matrix()
{
}
//转置
void matrix::MatrixTranpose(double *A,double *B,int m,int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
B[i*m+j]=A[j*n+i];
return ;
}
//求逆
int matrix::invers_matrix(double *m1,int n)
{
int *is,*js;
int i,j,k,l,u,v;
double temp,max_v;
is=new int(n*sizeof(int));
js=new int(n*sizeof(int));
for(k=0;k<n;k++)
{
max_v=0.0;
for(i=k;i<n;i++)
for(j=k;j<n;j++)
{
temp=fabs(m1[i*n+j]);
if(temp>max_v)
{
max_v=temp; is[k]=i; js[k]=j;
}
}
if(max_v==0.0)
{
delete is; delete js;
AfxMessageBox("error **not inverse",MB_OK);
return(0);
}
if(is[k]!=k)
for(j=0;j<n;j++)
{
u=k*n+j; v=is[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
if(js[k]!=k)
for(i=0;i<n;i++)
{
u=i*n+k; v=i*n+js[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
l=k*n+k;
m1[l]=1.0/m1[l];
for(j=0;j<n;j++)
if(j!=k)
{
u=k*n+j;
m1[u]*=m1[l];
}
for(i=0;i<n;i++)
if(i!=k)
for(j=0;j<n;j++)
if(j!=k)
{
u=i*n+j;
m1[u]-=m1[i*n+k]*m1[k*n+j];
}
for(i=0;i<n;i++)


if(i!=k)
{
u=i*n+k;
m1[u]*=-m1[l];
}
}
for(k=n-1;k>=0;k--)
{
if(js[k]!=k)
for(j=0;j<n;j++)
{
u=k*n+j; v=js[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
if(is[k]!=k)
for(i=0;i<n;i++)
{
u=i*n+k; v=i*n+is[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
delete is; delete js;
return(1);
}
//乘法
void matrix::MatrixMul(double *A,double *B,double *C,int m,int n,int z)
{
int i,j,k;
for(i=0;i<m;i++)
{
for(j=0;j<z;j++)
{
C[i*z+j]=0;
for(k=0;k<n;k++)
C[i*z+j]+=A[i*n+k]*B[k*z+j];
}
}
return;
}
...全文
175 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-07-23
  • 打赏
  • 举报
回复
//求逆 int matrix::invers_matrix(double *m1,int n) { int *is,*js; ... is=new int(n*sizeof(int)); ??? 分配一个整型变量的内存,值为 n*sizeof(int)???? js=new int(n*sizeof(int)); ??? 分配一个整型变量的内存,值为 n*sizeof(int)???? .... delete is; ??? delete js;??? 难道不是 //求逆 int matrix::invers_matrix(double *m1,int n) { int *is,*js; ... is=new int[n*sizeof(int)]; //分配 n个整形变量的内存,值设置不了。 js=new int[n*sizeof(int)]; //分配 n个整形变量的内存,值设置不了。 ... delete []is; delete []js; }
lm_whales 2013-07-23
  • 打赏
  • 举报
回复
double *AT=new double[]; double *N=new double[]; double *ATL=new double[]; double *K=new double[]; 这也能编译通过???,那么这里分配了多少内存你知道吗?????
claire_zhaoj 2013-05-07
  • 打赏
  • 举报
回复
每一步看的话,一到矩阵转置就出错。不存在越界啊
引用 13 楼 skynfly 的回复:
数组越界,还有看除数是不是零
claire_zhaoj 2013-05-06
  • 打赏
  • 举报
回复
数组都没有越界的,但是单步运行的时候rm.invers_matrix(N,6);这里运行显示的就是
但是矩阵求逆的部分以前就用过,这次直接粘过来的,应该能用啊?
引用 3 楼 shen_wei 的回复:
最好就单步了 运行了F10,这个看的更清楚。。数组越界的可能更大
shen_wei 2013-05-06
  • 打赏
  • 举报
回复
最好就单步了 运行了F10,这个看的更清楚。。数组越界的可能更大
claire_zhaoj 2013-05-06
  • 打赏
  • 举报
回复
刚开始学习,不知道怎么调用之后查错,能讲讲么
引用 1 楼 ouyh12345 的回复:
不能查看调用堆栈吗? 如果有缓冲区溢出,则可能崩溃的位置不对,需要仔细检查
ouyh12345 2013-05-06
  • 打赏
  • 举报
回复
不能查看调用堆栈吗? 如果有缓冲区溢出,则可能崩溃的位置不对,需要仔细检查
skynfly 2013-05-06
  • 打赏
  • 举报
回复
数组越界,还有看除数是不是零
claire_zhaoj 2013-05-06
  • 打赏
  • 举报
回复
啊?怎么被删了啊。。。能举个详细的例子么用try catch?
引用 11 楼 FredHuang85 的回复:
引用 8 楼 claire_zhaoj 的回复:
我把程序上传了,你能帮我看看吗 http://download.csdn.net/detail/claire_zhaoj/5336481 [quote=引用 7 楼 FredHuang85 的回复:] 都加上try catch,也有初始化不正确的可能。
没找到你上面的地址(CSDN告诉我打不开),加上try catch可能会出现更详细的错误描述,查看堆栈,可以看到具体的错误原因,手头没有VS2012,你可以百度下怎么查看堆栈。[/quote]
FredHuang85 2013-05-06
  • 打赏
  • 举报
回复
引用 8 楼 claire_zhaoj 的回复:
我把程序上传了,你能帮我看看吗 http://download.csdn.net/detail/claire_zhaoj/5336481
引用 7 楼 FredHuang85 的回复:
都加上try catch,也有初始化不正确的可能。
没找到你上面的地址(CSDN告诉我打不开),加上try catch可能会出现更详细的错误描述,查看堆栈,可以看到具体的错误原因,手头没有VS2012,你可以百度下怎么查看堆栈。
傻X 2013-05-06
  • 打赏
  • 举报
回复
楼主原来还不会用callstack 调用了CallStack就知道哪里崩溃了,返回去看就知道了
claire_zhaoj 2013-05-06
  • 打赏
  • 举报
回复
你能帮我直接看看程序吗?新手,堆栈那里不太懂 http://download.csdn.net/detail/claire_zhaoj/5336481 谢谢
引用 6 楼 RobertBaker 的回复:
死的时候,直接看堆栈不就行了?至于前面说的堆坏的问题,先保证其他问题解决了再说,
claire_zhaoj 2013-05-06
  • 打赏
  • 举报
回复
我把程序上传了,你能帮我看看吗 http://download.csdn.net/detail/claire_zhaoj/5336481
引用 7 楼 FredHuang85 的回复:
都加上try catch,也有初始化不正确的可能。
FredHuang85 2013-05-06
  • 打赏
  • 举报
回复
都加上try catch,也有初始化不正确的可能。
LiuYinChina 2013-05-06
  • 打赏
  • 举报
回复
死的时候,直接看堆栈不就行了?至于前面说的堆坏的问题,先保证其他问题解决了再说,
claire_zhaoj 2013-05-06
  • 打赏
  • 举报
回复
我自己顶顶啊。。。

16,472

社区成员

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

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

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