c ++ 2D char数组有时会在随机位置复制数据

时间:2017-12-07 20:45:30

标签: c++ arrays char 2d

我正在使用2D字符数组在屏幕上显示电路板。空板充满'。' (点),程序在某个位置写入另一个字符('G')。问题在于,有时(每四次更多一次)重复的角色出现在另一个位置。

 4 |.  .  .  .  .  .  |
 3 |.  .  .  .  .  .  |
 2 |G  .  .  .  .  .  |
 1 |.  .  .  .  G  .  |
------------------------
    a  b  c  d  e  f

相关代码片段是:

class Field
{
 public:
static const int FIELDWIDTH=6;
static const int FIELDHEIGHT=4;

char field[FIELDWIDTH][FIELDHEIGHT];
..
};

void Field::empty(void){
  for(int r=0; r<FIELDHEIGHT; r++)
    for(int c=0; c<FIELDWIDTH; c++)
      field[r][c] = '.';
};

Field::plot(){                   //Plots the board
for(int r=FIELDHEIGHT;r>0;r--){
    cout << std::setw(2) << std::setfill(' ') << r << " |";
    for(int c=0;c<FIELDWIDTH;c++)
      cout << field[r-1][c] << "  ";
    cout << "|" << endl;
  };
...
};

void Field::putChar(void){
...
(random definition of pr2 and pc2 and validation within limits)
...
 field[pr2][pc2]='G';
 printCors(pr2,pc2); //cout coordinate for debug
...
};

field [] []的唯一两个赋值是empty()中的ONE和putChar()中的ONE。 empty()按预期工作总是导致plot()所以:

 4 |.  .  .  .  .  .  |
 3 |.  .  .  .  .  .  |
 2 |.  .  .  .  .  .  |
 1 |.  .  .  .  .  .  |
------------------------
    a  b  c  d  e  f

并且使用cout监视putChar中的赋值,cout只输出一个坐标,但是有时会出现一个与预期角色有某种关系的附加角色,这里有一些运行:

b1=
 4 |.  .  .  .  .  .  |
 3 |.  .  .  .  .  .  |
 2 |.  .  .  .  .  .  |
 1 |.  G  .  .  .  .  |
------------------------
    a  b  c  d  e  f

e2=
 4 |.  .  .  .  .  .  |
 3 |G  .  .  .  .  .  |
 2 |.  .  .  .  G  .  |
 1 |.  .  .  .  .  .  |
------------------------
    a  b  c  d  e  f

e4=
 4 |.  .  .  .  G  .  |
 3 |.  .  .  .  .  .  |
 2 |.  .  .  .  .  .  |
 1 |.  .  .  .  .  .  |
------------------------
    a  b  c  d  e  f

a1=
 4 |.  .  .  .  .  .  |
 3 |.  .  .  .  .  .  |
 2 |.  .  .  .  .  .  |
 1 |G  .  .  .  .  .  |
------------------------
    a  b  c  d  e  f

a4=
 4 |G  .  .  .  .  .  |
 3 |.  .  .  .  G  .  |
 2 |.  .  .  .  .  .  |
 1 |.  .  .  .  .  .  |
------------------------
    a  b  c  d  e  f

如果我在putChar()函数中注释分配给field [] [] =,则董事会总是按预期为空,如果我添加其他赋值,有时两个字符都是重复,有时是一个,有时是任何人。

在putChar()中使用固定分配进行测试:

void Field::putChar(void){
...
(random definition of pr2 and pc2 and validation within limits)
...
 field[2][5]='H';
...
};

结果始终是:

 4 |.  H  .  .  .  .  |
 3 |.  .  .  .  .  H  |
 2 |.  .  .  .  .  .  |
 1 |.  .  .  .  .  .  |
------------------------
    a  b  c  d  e  f

似乎重复数据遵循模式,重复在可能的情况下始终显示为-4,1但为什么? 如果数组限制发生变化,则此模式会随着模式位置-FIELDHEIGHT而变化,相对于良好的模式位置为1。

有什么想法解决这个问题?

1 个答案:

答案 0 :(得分:0)

field[r-1][c] r从1转到FIELDHEIGHT,但field的第一维有FIELDWIDTH个元素。我认为你的意思是field[c][r-1]