【问题标题】:C++ program refuses to set value to matrix [closed]C ++程序拒绝为矩阵设置值[关闭]
【发布时间】:2017-08-29 08:10:47
【问题描述】:

好的,所以我有这个代码(声明是全局的)。它基本上是一个简单的国际象棋程序,程序的这一部分试图评估哪些领域在某个时间点受到黑子的威胁。如果一个字段受到威胁,它的 c3[][] 值会从 0 变为 1。问题是即使在我 100% 确定 if 条件满足之后,程序仍然会拒绝设置 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

}

【问题讨论】:

  • read about how to ask good questions,并学习如何创建Minimal, Complete, and Verifiable Example。我们需要查看那些变量声明。一些缩进也很好,可能还有一个换行符将代码分成段落,以使其更易于阅读。
  • 为什么要使用逗号?
  • ; 替换所有, 运算符会发生什么?
  • 我的猜测是尺寸是c2[8][8],但您可以访问索引1 直到8 处的元素。
  • 我把它做成了 c2[11][11]。我的程序在 c2[8][8] 时会表现得很奇怪,但是像这样它可以正常工作

标签: c++ variables matrix


【解决方案1】:

使用正确的缩进和括号放置是这里的关键!我剥离了所有实际处理东西的代码,只留下循环和 if 语句以提高可读性。然后我正确缩进了编译器如何看到它的代码

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 语句(if(c2[I][J] == 12 || c2[I][J] == 10)),只处理标记循环之后的第一个 if 语句。解决此问题的一种方法是在这种情况下使用 if-else 语句,或者用花括号将所有循环括起来,因为无论如何都应该这样做。这样您就可以在括号内添加和删除行,并且可以确保它们也将被处理。它还使非编译器阅读者(即试图理解代码的人)更清楚地了解程序流程。


还取决于c2 的大小,这可能是一个 8x8 数组,您应该更改循环条件。 C++ 使用 0 索引数组,因此大小为 8 的数组将由 0 - 7 而不是 1 - 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++) {
  // ...

【讨论】:

  • 在这一点上我完全站在你这边,但是说应该做一些事情,因为它是好的做法并不能解释太多。为什么这是好的做法?对我来说,主要原因是可以删除或添加带括号的行而不更改循环/if
  • @tobi303 好点。我已经编辑了答案。
  • 谢谢,它确实有效。我犯了一个愚蠢的错误:)
  • @JohnDoe 很高兴我能帮上忙。然后随意接受答案;-)
【解决方案2】:

如果您想调试代码中的基本问题,您需要停止尝试玩 c++ Golf。在适当的地方添加空格,包括新行。

在有问题的行上设置一个断点,将您的数组位置设置为 1,然后在该变量上逐行查看代码,逐行执行。我可以保证它不是“拒绝设置它”。它是您代码中的一个分支,您不希望执行它。

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多