首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

数组的赋值有关问题。调试006.exe 中的 0x778cf8c5 处未处理的错误: 0xC0000005: 写入位置 0x00030ffc 时发生访问冲突

2013-03-29 
数组的赋值问题。调试006.exe 中的 0x778cf8c5 处未处理的异常: 0xC0000005: 写入位置 0x00030ffc 时发生访

数组的赋值问题。调试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;
}

热点排行