2011-08-15 67 views
-3
#include`<stdio.h>` 
#include`<stdlib.h>` 
int main() 
{ 
    int k, i, j,tot=0, htot=0, vtot=0, dtot=0, m, n;   
    int a[8][8] = { 
    {0,0,0,0,0,0,1,0}, 
    {0,0,0,1,0,0,0,0}, 
    {0,1,0,0,0,0,0,0}, 
    {1,0,0,0,0,0,0,0}, 
    {0,0,1,0,0,0,0,0}, 
    {0,0,0,0,0,1,0,0}, 
    {0,0,0,0,1,0,0,0}, 
    {0,0,0,0,0,0,0,1}, 
}; 

for(i=0;i<8;i++)   
{ 
    htot=0; 
    printf("\n"); 
    for(j=0;j<8;j++) 
    { 
     htot += a[i][j]; 
     printf("%d\t", a[i][j]);  
    }  
    tot += htot ; 
} 

if(tot == 8) 
printf("Moving on to Vertical checking"); 
else 
printf("Horizontal criterion not fulfilled %d ", tot); 
tot=0; 
for(j=0;j<8;j++) 
{ 
    vtot=0; 
    printf("\n"); 
    for(i=0;i<8;i++) 
    { 
     vtot += a[i][j]; 
     printf("%d\t", a[i][j]); 
    } 
    tot +=vtot; 
} 
if(tot == 8) 
printf("Moving on to Diagonal checking"); 
else 
printf("Vertical criterion not fulfilled %d ", tot);  

for(i=0;i<8;i++) 
{ 
    for(j=0;j<8;j++) 
    { 
    if(a[i][j]) 
    { 
     m=i; 
     n=j; 
     while(n!=0)// running the loop leftwards 
     { 
     m++; 
     n--; 
     dtot +=a[m][n];  
     } 
     printf("diagonal left total = %d", dtot); 
     if(dtot == 1) 
     { 
     m=i; 
     n=j;    
     while(n!=0)// running the loop rightwards 
     { 
     m++; 
     n++; 
     dtot +=a[m][n]; 
     } 
     printf("diagonal right total = %d", dtot); 
    } 
} 
} 
} 
return 0; 
} 
+1

要做的最好的事情就是通过像gdb这样的调试器来运行它,并告诉我们发生分段错误的确切行。 – GWW

+1

它在哪里段错?你的调试器告诉你什么?这甚至应该做什么? – Mat

+1

请缩进您的代码,以便它可以真正被读取。 – zellio

回答

1
while(n!=0)// running the loop rightwards 
{ 
    m++; 
    n++; 
    dtot +=a[m][n]; 
} 

这似乎是一个非常明显的崩溃对我来说。增加n并检查n!=0

之前的循环可能也会崩溃,因为m用尽了数组索引。

在这些循环中放置一些printfmn。更好的是:在编写代码之前考虑数组索引范围。

+0

是的,我在这件事上发现了我的错误。谢谢 :) –

1

对角线运行未正确界定。你只是检查n索引,并且你在右边的范围检查它是错误的方向。在某个点n超出范围并执行非法数组访问。