C 程序拒绝将值设置为矩阵

C++ program refuses to set value to matrix

本文关键字:设置 程序 拒绝      更新时间:2023-10-16

好,所以我有此代码(声明为全局)。这基本上是一个简单的国际象棋程序,该计划的这一部分试图评估哪些字段在某个时间点受到黑色碎片的威胁。如果一个字段受到威胁,则C3 [] []值从0到1。问题是,即使我100%确定是否满足条件,该程序仍将拒绝设置C3 [] [] [] [] [] []]值为1。甚至更糟糕的是,the if(c2[I][J]==9||c2[I][J]==10) part工作正常,这使我更难识别问题。我可以在必要时提供整个源代码。

void atacalb()
{
 int I,J;
  for(I=1;I<=8;I++)
    for(J=1;J<=8;J++)
 {if(c2[I][J]==7){c3[I+1][J+1]=1,c3[I+1][J-1]=1;}
  if(c2[I][J]==8){c3[I+2][J+1]=1,c3[I+2][J-1]=1,c3[I+1][J+2]=1,c3[I-1][J+2]=1,c3[I-2][J+1]=1,c3[I-2][J-1]=1,c3[I+1][J-2]=1,c3[I-1][J-2]=1;}
 int z,x,ok;
 for(I=1;I<=8;I++)
    for(J=1;J<=8;J++)
 if(c2[I][J]==9||c2[I][J]==10)
{
 z=I,x=J,ok=1;
 while((z<=8||x<=8)&&ok)
    {z++,x++;
     if(c2[z][x]==0)c3[z][x]=1;
        else {c3[z][x]=1,ok=0;}
    }
 z=I,x=J,ok=1;
 while((z<=8||x>=1)&&ok)
    {i++,j--;
     if(c2[z][x]==0)c3[z][x]=1;
        else {c3[z][x]=1,ok=0;}
    }
 z=I,x=J,ok=1;
 while((z>=1||x>=1)&&ok)
    {z--,x--;
     if(c2[z][x]==0)c3[z][x]=1;
        else {c3[z][x]=1,ok=0;}
    }
 z=I,x=J,ok=1;
 while((z>=1||x<=8)&&ok)
    {z--,x++;
     if(c2[z][x]==0)c3[z][x]=1;
        else {c3[z][x]=1,ok=0;}
    }
}
 if(c2[I][J]==12||c2[I][J]==10)
 {z=I,x=J,ok=1;
  while(x<=8&&ok==1)
    {x++;
     if(c2[z][x]==0)c3[z][x]=1;
        else {c3[z][x]=1,ok=0;}
    }
  z=I,x=J,ok=1;
  while(z<=8&&ok==1)
    {z++;
     if(c2[z][x]==0)c3[z][x]=1;
        else {c3[z][x]=1,ok=0;}
    }
    z=I,x=J,ok=1;
  while(z>=1&&ok==1)
    {z--;
     if(c2[z][x]==0)c3[z][x]=1;
        else {c3[z][x]=1,ok=0;}
    }
    z=I,x=J,ok=1;
  while(x>=1&&ok==1)
    {x--;
     if(c2[z][x]==0)c3[z][x]=1;
        else {c3[z][x]=1,ok=0;}
    }
    }
  }
}

int main()
{//some code
 atacalb();
 //some more code

}

使用适当的压力和括号放置是关键!我剥离完成了所有代码,实际上是处理内容,只是左循环和IF statements以供可读性。然后,我正确地缩进了编译器如何看到它的代码

int I, J;
for(I = 1; I <= 8; I++)
  for(J = 1; J <= 8; J++) {
    if(c2[I][J] == 7) {
    }
    if(c2[I][J] == 8) {
    }
    for(I = 1; I <= 8; I++)
      for(J = 1; J <= 8; J++) /*!*/
        if(c2[I][J] == 9 || c2[I][J] == 10) { ///< only this gets processed by the loop
          while((z <= 8 || x <= 8) && ok){
            if(c2[z][x] == 0)  {
            }
            else {
            }
          }
          while((z <= 8 || x >= 1) && ok) {
            if(c2[z][x] == 0) {
            }
            else {
            }
          }
          while((z >= 1 || x >= 1) && ok) {
            if(c2[z][x] == 0) {
            }
            else {
            }
          }
          while((z >= 1 || x <= 8) && ok) {
            if(c2[z][x] == 0) {
            }
            else {
            }
          }
        }
    if(c2[I][J] == 12 || c2[I][J] == 10) { ///< not this
      while(x <= 8 && ok == 1) {
        if(c2[z][x] == 0) {
        }
        else {
        }
      }
      while(z <= 8 && ok == 1) {
        if(c2[z][x] == 0) {
        }
        else {
        }
      }
      while(z >= 1 && ok == 1) {
        if(c2[z][x] == 0) {
        }
        else {
        }
      }
      while(x >= 1 && ok == 1) {
        if(c2[z][x] == 0) {
        }
        else {
        }
      }
    }
  }

问题在上面的代码中标记:For循环(标记的/*!*/)不会仅处理IF-Statement(if(c2[I][J] == 12 || c2[I][J] == 10))仅在标记循环后的第一个IF语句。解决此操作的一种方法是在这种情况下使用IF-Else statement,或用卷曲的支架包围所有循环。这是为了使您可以添加和删除括号内的线条,并且可以确保它们也将被处理。此外,这也使该程序更清楚地对非编译器阅读器(即试图理解代码的人)。


也取决于c2的大小,这可能是8x8阵列,您应该更改循环条件。C 使用0个索引数组,因此索引从0-7而不是1-8访问了一个大小8的数组。因此,例如

for(I = 1; I <= 8; I++)
  for(J = 1; J <= 8; J++) {
  //...

很可能应该是

for(I = 0; I < 8; I++) // smaller not smaller-equal
  for(J = 0; J < 8; J++) {
  // ...

如果您想在代码中调试基本问题,则需要停止尝试玩C 高尔夫。在适当的地方添加空白,包括新行。

在所讨论的行上设置一个断点,该线路将您的数组位置设置为1,然后用该变量上的手表逐行逐步浏览代码。我可以保证它不会"拒绝设置它"。它是您不希望执行执行的代码中的分支。