读书人

数组的赋值有关问题。调试006.exe 中的

发布时间: 2013-03-29 14:24:52 作者: rapoo

数组的赋值问题。调试006.exe 中的 0x778cf8c5 处未处理的异常: 0xC0000005: 写入位置 0x00030ffc 时发生访问冲突
int i=0,j,m; //i表示个体数即第i组参数,j表示第j个基因即第i组参数中j个
int k=0,a[16]={0};
double sum1,sum2,sum;
float parameter[5],f;

……
typedef struct
{
int gene[5][16];
}
individual;

……

for(i=0;i<4;i++) //第i组参数
{
cout<<"Please enter NO."<<i+1<<" set of parameter:"<<endl;
cin>>parameter[0]; //输入参数
cin>>parameter[1];
cin>>parameter[2];
cin>>parameter[3];
cin>>parameter[4];
for(j=0;j<5;j++) //第j个参数
{ /*以下为格雷编码*/
m=(int)(parameter[j]);
f=parameter[j]-m;
for(k=7;k>=0;k--) //第k位参数基因
{
a[k]=(int)(f*2);
f=f*2-a[k];//下一次被除数为上次除2的商
}
k=8;
while(m)
{
a[k]=m%2;
k++;
m=m/2;//下一次被除数为上次除2的商
}
cout<<"Gray code: ";

for(k=0;k<7;k++)
{
a[k]=a[k+1]^a[k];
}
for(k=8;k<15;k++)
{
a[k]=a[k+1]^a[k];
}
for(k=15;k>=0;k--)
{
if(k==7)cout<<".";
parent[i].gene[j][k]=a[k];
cout<<parent[i].gene[j][k]; //总感觉这样直接赋值不妥,但找不到原因。
}
cout<<endl;
}
……

以上是程序节选,运行没有错误,但是运行到第四组第四个参数时,始终不能编码。
出现以下错误提示:
调试006.exe 中的 0x778cf8c5 处未处理的异常: 0xC0000005: 写入位置 0x00030ffc 时发生访问冲突
请高手解答。 C++???格雷编码???数组
[解决办法]
断点调点下,应该是野指针错误,或者写入地址有问题~
[解决办法]

引用:

int i=0,j,m; //i表示个体数即第i组参数,j表示第j个基因即第i组参数中j个
int k=0,a[16]={0};
double sum1,sum2,sum;
float parameter[5],f;

……
typedef struct
{
int gene[5][16];
}
individual;

……

……

看代码之前专门回顾了一下格雷码。。
代码中修改了以下几处,测试就好了:

cin >> parameter[0]; //输入参数
cin >> parameter[1];
cin >> parameter[2];
cin >> parameter[3];
cin >> parameter[4];

// 为了避免残留数据的影响,这里每次都重置数组,
// 后面我会再说为什么要这么做
memset(a, 0, sizeof(a));

另外:

//k = 8;
//while (m)
//{
// a[k] = m % 2;
// k++;
// m = m / 2;//下一次被除数为上次除2的商
//}

// 用下面的for循环替换上面的循环
// 因为上面的循环,终结条件依赖于输入的值,如果m很大,你这个k++就会运行很多次,
// 从而覆盖数组a之后的数据
// 另外,如果用上面的while,如果m很小,那么可能修改一两个数据就结束了,那么,
// a[k]后面的数据就是上次遗留下来的无效值,这就是为什么要每次将a清零
for (k = 8; k < 16; ++k)
{
a[k] = m % 2;
m = m / 2;
}

读书人网 >C++

热点推荐