【问题标题】:Working with some members of a struct affects other members of the struct C++使用结构的某些成员会影响结构 C++ 的其他成员
【发布时间】:2017-03-05 09:47:08
【问题描述】:

问题已解答,谢谢 问题显然来自没有声明足够大的 vf 也包含 9 --> 它应该是 vf[10]


长话短说,在输入文件中,我有一个 9 x 9 元素的二维数组。它包含来自 {0 , 1 ... 9} 的元素。我需要弄清楚每个数字在每行上出现了多少次(为此我使用了 vf[] 数组),以及与 0 不同的次数(为此我使用了 '')。我将 vf[]number 包含在 struct 中,如下所示:

struct Line
{
    short vf[9];
    short number;
}L[10];

读取二维数组后,我使用 Analyze() 来确定每一行有多少个数字不同于 0,以及每个数字在该行上出现的次数。

void Analyze()
{
    for ( short i = 1 ; i <= 9 ; ++i )        // lines
        for ( short j = 1 ; j <= 9 ; ++j )    //columns
            if ( M[i][j] )                    //different from 0
            {
                L[i].number++;
                L[i].vf[ M[i][j] ]++;
            }
}

现在,这里出现了一个我无法解释的问题。这是输入的样子:

2 5 8 7 3 0 9 4 1    // number should be 8
6 0 9 8 2 4 3 0 7    // number should be 7
4 0 7 0 1 5 2 6 0    // number should be 6
3 9 5 2 7 0 4 0 6    // number should be 7
0 6 2 4 0 8 1 0 5    // number should be 6
8 4 0 6 5 0 7 2 9    // number should be 7
1 8 4 3 6 9 5 7 2    // number should be 9
0 7 0 1 4 2 0 9 3    // number should be 6
9 2 3 5 8 7 6 1 4    // number should be 9

但是,我从每一行得到的数字是:

9 8 6 8 6 8 10 7 10 

现在,如果我从 Analyze() 中删除 L[i].vf[ M[i][j] ]++; 行,我会得到一个不同的输出,即:

8 7 6 7 6 7 9 6 9

所以问题是,有没有人预感为什么增加 vf[] 似乎也会对 number 产生影响?

如果我犯了任何英语错误,请放轻松。

【问题讨论】:

  • M是如何声明的?是 M[10][10] 吗? M的内容怎么样 - 范围是0..8吗?
  • 如果我也以这种方式读取数组,我认为应该没有问题。我在学校就是这样教的,这成了一种习惯。是的,它被声明为短 M[10][10] 。它只能包含 { 0 ... 9 } 中的元素。
  • 没有vf[9]vf的索引范围是0到8。
  • 这可能是未定义的行为,因为仅在循环条件中看到类似i &lt;= 9 的内容就表明您正在阅读某事的结尾。但是你必须发布一个 MCVE,否则它只是猜测。
  • 对自己的问题写一个答案并接受它是可以接受的。请考虑这样做。不赞成在问题本身添加“谢谢,已解决”注释。

标签: c++ arrays struct


【解决方案1】:

以下是我对此代码显示/做出的一些错误/更改:

struct Line
{
    short vf[9]; 
             ^^ here a number 9 can't be counted as index range is 0-8
    short number;
    Line()
    {
        std::fill_n(v,9,0); //fills the array with 0
        number = 0; // Initialized the number with 0
    }

}L[10];

编辑:感谢@HolyBlackCat 的评论,我意识到初始化部分的错误。我现在已经更正了。

【讨论】:

  • 如果高于main,是否有必要将它们声明为0?我从来没有遇到过全局未声明变量的问题。
  • vf[9] = {0}; 不初始化任何东西。它将0 分配给不存在的数组元素,导致未定义的行为。
  • @HolyBlackCat 感谢您指出这一点。改变了答案。
  • @MihaiBontea 初始化数组是 C++ 中的好习惯。您可以查看有关此主题的许多答案,例如here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2018-10-02
相关资源
最近更新 更多