有人可以告诉我for循环有什么问题吗?当我运行它时,它会中断。我试着调试看看有什么问题,我注意到在for循环中它只是停止了:
#define MAX_POPULATION 64
float **tr_pop;//Tournament candidates
float **matingPool;//Mating pool
tr_pop=new float *[m];
matingPool=new float *[m];
for(l=0;l<m+1;l++)//allocating
{
tr_pop[l]=new float[MAX_POPULATION];
matingPool[l]=new float[MAX_POPULATION];
}
for ( int r = 0; r < row; ++r )//deleting
{
delete [] matingPool[r];//Stops here (not ending program just frozen)
delete [] tr_pop[r];
}
delete [] tr_pop;
delete [] matingPool;
=======确定。问题已解决=======
原因如下:
我刚刚将MAX_POPULATION
更改为MAX_POPULATION+1
,但它确实有效。
for(l=0;l<m+1;l++)
{
tr_pop[l]=new float[MAX_POPULATION+1];
matingPool[l]=new float[MAX_POPULATION+1];
}
因为在另一个函数中我认为我做了违规行为:
void crossover()
{
int p1,p2,i,j;float tempBit;
p1=m/3;
p2=(2*m)/3;
for(j=0;j<MAX_POPULATION;j++)
{
for(i=p1;i<p2;i++)
{
tempBit=matingPool[i][j];
matingPool[i][j]=matingPool[i][j+1];//THE VIOLATION POINT (I THINK)
matingPool[i][j+1]=tempBit;
}
j++;
}
正如您所看到的,当循环结束时j = MAX_POPULATION
时,我正试图触及MAX_POPULATION + 1
。所以我改变了列的分配,问题解决了:)
答案 0 :(得分:2)
您遇到了未定义的行为:
for(l=0;l<m+1;l++)//allocating
{
tr_pop[l]=new float[MAX_POPULATION];
}
应该是
for(l=0;l<m;l++)//allocating
{
tr_pop[l]=new float[MAX_POPULATION];
}
您为每个阵列分配了m
个元素,并尝试访问m+1
。
答案 1 :(得分:1)
您正在分配m
float*
,但在for
循环中,您在分配内存时从0..m
进行迭代,它应来自0..m-1
。为此,您需要将for
循环设置为:for(l=0;l<m;l++)
。