2

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;

=======OK。解決した問題=======

理由は次のとおりです。

に変更しただけ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。そこで、列の割り当てを変更すると、問題は解決しました:)

4

2 に答える 2

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

于 2012-04-09T10:02:10.390 に答える
1

割り当てm float*ていますが、メモリの割り当て中forに反復しているループでは、 . そのためには、ループを :に変更する必要があります。0..m0..m-1forfor(l=0;l<m;l++)

于 2012-04-09T10:02:30.437 に答える