数年来未目睹之while怪现状

onethousand 2006-11-16 09:10:10
VC 6.0 做一个涉及到矩阵运算的问题。
在函数里有 zmax,colmax,minrow等几个变量,还有一个自定义对象 EMatrix.都有值的。
同一函数体内,接下来一个while循环,iter已被赋值true.
while(iter) {
....
}

由于程序运行错误,在debug模式下看,进入循环体后,上面的那几个变量的值被取到-858993460了,当然,我原来的值不是这样的。

第一次碰到这种奇怪现象。ft!

似乎是被重新定义了,因为在Locals下面还能看到另外几个同名变量,是原值。
按理,我没有重新声明,是不会有这种情况的。
...全文
182 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
onethousand 2006-11-16
  • 打赏
  • 举报
回复
关键是while里面出了问题。
有几个变量是类的私有变量。
编译,运行都没问题
onethousand 2006-11-16
  • 打赏
  • 举报
回复
SimMethod::SMsolver()
{
int *basmat=new int[rowmx]; //存放基矩阵的列数,即约束矩阵中哪几列构成基矩阵
long double *xb=new long double[rowmx]; //存放单纯形表右端项
// int xB[rowmx]={0};
// int xN[colmx-rowmx]={0};
long double *w=new long double[rowmx]; //存放单纯形乘子
long double *z=new long double[colmx]; //存放判别数
long double *y=new long double[rowmx]; //存放主列元素
int iter=0; //是否需要继续迭代标志

for(int i=0;i<rowmx;i++) {
basmat[i]=0;
xb[i]=0;
w[i]=0;
y[i]=0;
}
for(i=0;i<colmx;i++) z[i]=0;

//第一次迭代过程
//指定基矩阵构成列
f=0;
cout<<endl;
cout<<"\nPlease appoint the columns of iniational elementary matrix:";
cout<<"\nAttension:the iniational elementary matrix should be a identity matrix."<<endl;
for(i=0;i<rowmx;i++)
cin>>basmat[i];

//计算右端项和单纯形乘子
for(i=0;i<rowmx;i++) {
xb[i]=b[i];
w[i]=c[basmat[i]-1];
}

for(i=0;i<rowmx;i++) {
f+=c[basmat[i]]*xb[i];
}

//计算判别数,并对迭代标志进行置位或复位
long double zmax=-1000000000000;
int colmax=0;
for(i=0;i<colmx;i++) {
int sum=0;
for(int j=0;j<rowmx;j++) sum+=w[j]*ctmatrp[j][i];
z[i]=sum-c[i];
if(z[i]>zmax) { zmax=z[i]; colmax=i;}
if(z[i]>0) iter=1;
}

//计算主列,并选择离基变量
for(i=0;i<rowmx;i++) y[i]=ctmatrp[i][colmax];
long double ymin=1000000000;
int minrow=0;
for(i=0;i<rowmx;i++) {
if(y[i]>0&&xb[i]/y[i]<ymin) {ymin=xb[i]/y[i];minrow=i;}
}
basmat[minrow]=colmax;//修正基矩阵

//构造初始矩阵
EMatrix E(rowmx,minrow,y);

//迭代过程
while(iter) {
f=0;
iter=0;

E*xb;
for(int i=0;i<rowmx;i++) w[i]=c[basmat[i]];
w*E;

for(i=0;i<rowmx;i++) {
f+=c[basmat[i]]*xb[i];
}

long double zmax=-1000000000000;
int colmax=0;
for(i=0;i<colmx;i++) {
int sum=0;
for(int j=0;j<rowmx;j++) sum+=w[j]*ctmatrp[j][i];
z[i]=sum-c[i];
if(z[i]>zmax) { zmax=z[i]; colmax=i;}
if(z[i]>0) iter=1;
}
if(!iter) break;

for(i=0;i<rowmx;i++) y[i]=ctmatrp[i][colmax];
long double ymin=0;
int minrow=0;
for(i=0;i<rowmx;i++) {
if(y[i]>0&&xb[i]/y[i]>ymin) {ymin=xb[i]/y[i];minrow=i;}
}
basmat[minrow]=colmax;

EMatrix E(rowmx,minrow,y);
}

cout<<endl;
cout<<"\nThe solver is:\n";
for(i=0;i<rowmx;i++)
cout<<"X"<<basmat[i]<<"="<<xb[i]<<" ";
cout<<"\nThe optimize value is "<<f;

delete[] basmat;
delete[] xb;
delete[] w;
delete[] z;
delete[] y;
}
lann64 2006-11-16
  • 打赏
  • 举报
回复
不会是数组哇什么的越界闹得吧。
lei001 2006-11-16
  • 打赏
  • 举报
回复
贴个代码看看吧
onethousand 2006-11-16
  • 打赏
  • 举报
回复
应该不是程序问题,以前编的其他的运行都很好。
新建了工程,没用。

晕!
飞哥 2006-11-16
  • 打赏
  • 举报
回复
呵呵,肯定是你自己的问题

初始化作了吗?
作用域搞清楚了吗?


跟踪没发现问题??

天啊 ,搞笑吧
一分之千 2006-11-16
  • 打赏
  • 举报
回复
是程序出问题了吧?新建个工程,再试试吧 有时候是会出怪病的

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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