问题描述
这是在构建日志中显示的内容:
检查是否存在:C:\ CodeBlocks \ hammingcodeven.exe 执行中:““ C:\ CodeBlocks / cb_console_runner.exe”“ C:\ CodeBlocks \ hammingcodeven.exe”“(在'C:\ CodeBlocks'中) 设置变量:PATH = C:\ MinGW \ bin; C:\ MinGW; C:\ Windows \ System32; C:\ Windows; C:\ Windows \ System32 \ wbem; C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 ; C:\ Windows \ System32 \ OpenSSH; C:\ Program Files(x86)\ Intel \ Intel(R)管理引擎组件\ DAL; C:\ Program Files \ Intel \ Intel(R)管理引擎组件\ DAL; C :\ Users \ mahek \ AppData \ Local \ Microsoft \ WindowsApps 进程终止,状态为-1073741510(0分钟,54秒)
这是使用偶数奇偶汉明码后查找m位代码的二进制值的代码
#include<iostream>
#include<math.h>
using namespace std;
class data
{
int A[50],m,r,ps[6],B[6][56],final[56];
public:
void show();
void input();
void findr();
void findps();
void binary();
void findfinal();
};
void data::input()
{
cout<<"Enter length of frame:";
cin>>m;
cout<<"Enter frame:";
for(int i=1;i<=m;i++)
{
cin>>A[i];
}
findr();
}
void data::findr()
{
r=0;
for(int i=1;i<=m;i++)
{
int x=pow(2,i);
if(x>(m+i+1))
{
r=i;
break;
}
}
if(r==0)
cout<<"Error";
binary();
}
void data::binary()
{
for(int i=1;i<=m+r;i++)
{
int h=i;
for(int j=r;j>=1;j--)
{
B[i][j]=h%2;
h=h/2;
}
}
findps();
}
void data::findps()
{
for(int i=1;i<=r;i++)
ps[i]=0;
for(int i=1;i<=m+r;i++)
{
for(int j=1;j<=r;j++)
{
ps[j]=ps[j]^B[i][j];
}
}
findfinal();
}
void data::findfinal()
{
for(int i=1,j=1;i<=m+r,j<=r;i++,j*=2)
{
if(i==j)
{
final[i]=ps[j];
}
else
final[i]=A[i];
}
}
void data::show()
{
cout<<"Input:";
for(int i=1;i<=m;i++)
cout<<A[i]<<" ";
cout<<endl;
cout<<"Output:";
for(int i=1;i<=m+r;i++)
cout<<final[i]<<" ";
}
int main()
{
data obj;
obj.input();
obj.show();
}
解决方法
在函数binary()
的第一个循环中,变量i可以高达m + r
。在您的示例中,m为8,因此m + r
至少为9。但是,i用于索引B的第一维,其大小为6。访问超出其定义大小的B会导致读/写堆栈上的其他内存,从而导致未定义的行为。为了解决这个问题,您可以动态分配所需大小的字段。我也强烈建议为您的字段提供有意义的名称,以帮助人们了解您的代码正在尝试做什么。
此外,您未正确索引数组。在C ++和许多其他语言中,数组的索引为零,这意味着大小为n的数组A的第一个值为A [0],最后一个值为A [n-1]。