好的,所以我有这个代码(声明是全局的)。它基本上是一个简单的国际象棋程序,该程序的这一部分试图评估哪些领域在某个时间点受到黑色碎片的威胁。如果一个字段受到威胁,它的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
}
答案 0 :(得分:0)
如果要调试代码中的基本问题,则需要停止尝试使用c ++高尔夫。在适当的位置添加空格,包括新行。
在有问题的行上设置断点,将数组位置设置为1,然后逐行查看该变量的代码。我可以保证不会拒绝设置它。&#34;它是您的代码中的一个分支,您不希望执行它。
答案 1 :(得分:0)
使用适当的缩进和支架放置是关键!我剥离了所有实际处理内容的代码,只是留下了循环和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语句(if(c2[I][J] == 12 || c2[I][J] == 10)
)。解决这个问题的方法是在这种情况下使用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++) {
// ...