首页 > 解决方案 > 代码块在执行代码时给我以下错误(甚至奇偶汉明代码)

问题描述

错误信息这是我输入后收到的消息

这是它在构建日志中显示的内容:

检查是否存在: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) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\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();
    }

标签: c++codeblocks

解决方案


在函数的第一个循环中binary(),变量 i 可以达到m + r. 在您的示例中,m 为 8,因此m + r至少为 9。但是,i 用于索引 B 的第一个维度,其大小为 6。访问 B 超出其定义的大小会导致读取/写入堆栈上的其他内存,从而导致未定义的行为。为了解决这个问题,您可以动态分配具有所需大小的字段。我还强烈建议为您的字段提供有意义的名称,以帮助人们理解您的代码正在尝试做什么。

此外,您对数组的索引不正确。在 C++ 和许多其他语言中,数组是零索引的,这意味着大小为 n 的数组 A 的第一个值在 A[0] 处,最后一个值在 A[n-1] 处。


推荐阅读