急求,没有赋值,值就自动变了

wangchentong 2008-03-03 02:54:46
有两个问题:1是,程序执行到这里时,没有进入循环,
for (i=0;i<n;i++)
{
tw1=1.0/m_ModelSurV[i]+Z_Inc[i];
m_ModelSurV[i]=(float)tw1;
}
m_ModelSurV的值会自动改变,这是为什么?
然后,我故意加上赋值语句,tw1=1.02f;发现赋值前,m_ModelSurV的值就变了。
2是,delete []Z_Inc;执行这句,就报错。调试时,提示内容“User breakpoint called from code at 0x7c921230”。但是前面已经double *Z_Inc;//模型的增量
Z_Inc=new double [n];
申请了这段空间,为什么不行呢?
代码如下:
void CRSBonMView::OnModelV1()
{
// TODO: Add your command handler code here
//1.先读出初至时间文件中读出实际时间(即实际时间),放在m_FBP中
CFileDialog pFileOpenDlg(TRUE,NULL,NULL,NULL,"TXT file(*.txt)|*.txt|All Files(*.*)|*.*||");
CString strPathName;
FILE *fp;
int i_line=0;//文件行数,也即射线条数,也是距阵的行数,
//需注意的是,通常由于最后回车,读出的行数比实际需要的多了一行,应减去
struct FirstBreakTime myfbt;
char c;
if(pFileOpenDlg.DoModal()==IDOK)
{
strPathName=pFileOpenDlg.GetPathName();
if ((fp=fopen(strPathName, "r")) == NULL)
{
MessageBox("Can not open %s file.\n", strPathName);
return;
}
else
{
while (!feof(fp))
{
fscanf (fp,"%f%c%f%c%f",&myfbt.ShotID,&c,&myfbt.ReceiverID,&c,&myfbt.time);
m_FBT.Add (myfbt);
i_line++;
}
i_line=i_line-1;//通常由于最后回车,读出的行数比实际需要的多了一行,应减去
m_FBT.RemoveAt (m_FBT.GetSize ()-1);
}
}
else
{
MessageBox ("没有输入初至文件!");
return;
}
//2.根据初始模型,计算初至时间
int i;//用于循环
int m,n;//用于矩阵的行和列
m=m_FBT.GetSize ();
n=int(m_XIDMax-m_XIDMin);

double *t_time,*e_time;//t_time存放FindTraceTime返回的时间,也就是模型的初至时间
//e_time存放的旅行时的残差,
t_time=new double[m];
e_time=new double[m];

double **Jacobian;//雅可比矩阵,m*n
Jacobian=(double **)new double *[m];
for (i=0;i<m;i++)
{
Jacobian[i]=new double [n];
}
double **JacobianT;//临时的雅可比矩阵的转置,n*m
JacobianT=(double **)new double *[n];
for (i=0;i<n;i++)
{
JacobianT[i]=new double [m];
}
double *tJa;
tJa=new double [m*n];

double *Z_Inc;//模型的增量
Z_Inc=new double [n];

m_ModelSurV=new float[n];

for(i=0;i<n;i++)
{
m_ModelSurV[i]=400.0f;
}
float emax=100.0;
float e=0.02f;//e是循环终止标准
int CycNum=0;
BOOL tflag=TRUE;

Engine *ep;
if (!(ep=engOpen(NULL)))
{
MessageBox("不能打来Matlab引擎,返回!");
return;
}
mxArray *Ja=mxCreateDoubleMatrix(m,n,mxREAL);//传递的Jacobian矩阵
mxArray *etime=mxCreateDoubleMatrix(m,1,mxREAL);//传递的残差矩阵
float tshot,trece;

//while (TRUE==tflag)
while (1)
{
tflag=FALSE;
for (i=0;i<m;i++)
{
tshot=m_FBT[i].ShotID;
trece=m_FBT[i].ReceiverID;
t_time[i]=FindTraceTime(tshot,trece,m_ModelSurV,m_RefV,m_RefElve);
e_time[i]=(m_FBT[i].time-t_time[i])*0.001f;//
}

emax=FindEMax(e_time,m)*1000.0f;
if(emax<e)
{
break;
}
else
{
CycNum++;
for (i=0;i<m;i++)
{
FillV1Jac(m_FBT[i].ShotID,m_FBT[i].ReceiverID,m_ModelSurV,m_RefV,m_RefElve,Jacobian[i]);
}

/*******下面把Jacobian矩阵传递给matlab*******/
MatrixTrans(Jacobian,JacobianT,m,n);
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
tJa[i*m+j]=JacobianT[i][j];//秒和毫秒之间的单位转换
}
}
delete []JacobianT;

memcpy(mxGetPr(Ja),tJa,m*n*sizeof(double));
delete []tJa;

engPutVariable(ep,"Ja",Ja);
memcpy(mxGetPr(etime),e_time,m*sizeof(double));
engPutVariable(ep,"etime",etime);
engEvalString(ep,"JaNew=Ja'*Ja");
engEvalString(ep,"eNew=Ja'*etime");
engEvalString(ep,"a=inv(JaNew)");
engEvalString(ep,"x=a*eNew");
mxArray *x=engGetVariable(ep,"x");
memcpy(Z_Inc,mxGetPr(x),m*sizeof(double));
/*********矩阵传递,结束,模型的增量存在数组Z_Inc中*********************/
double tw1;
//程序执行到这里时,m_ModelSurV的值会自动改变,这是为什么?
tw1=1.02f;
for (i=0;i<n;i++)
{
tw1=1.0/m_ModelSurV[i]+Z_Inc[i];
m_ModelSurV[i]=(float)tw1;
}
}
}
//delete []Z_Inc;执行这句,就报错。调试时,提示内容“User breakpoint called from code at 0x7c921230”
// delete []Z_Inc;
delete []JacobianT;
delete []tJa;


FILE *wfp;
if ((wfp=fopen("RealV1.txt", "w")) == NULL)
{
MessageBox ("Can not open file RealV1.txt!");
return;
}
else
{
for (int i=0;i<n;i++)
{
fprintf(wfp, "%8.6f\n",m_ModelSurV[i]);
}
fclose (wfp);
MessageBox("写文件RealV1.txt结束!");
}


CString str;
str.Format ("CycNum=%d",CycNum);
MessageBox(str);
if (CycNum>0)
{
mxDestroyArray(Ja);
mxDestroyArray(etime);
}

engClose(ep);
}
...全文
127 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2008-03-03
  • 打赏
  • 举报
回复
一年标题就想到可能是数组越界,贴的代码太乱了。
kyxfx 2008-03-03
  • 打赏
  • 举报
回复
1。 你看看前面有没有数组越界,可能是前面数组的越界把后面的值改变了
2。 User breakpoint called from code at 0x7c921230
我怎么觉得这个是断点的提示呢??
wangchentong 2008-03-03
  • 打赏
  • 举报
回复
终于,黄天不负有心人那。我搞定了。

16,471

社区成员

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

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

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