C:运行时错误判定(帮助调试)

时间:2016-01-12 21:05:23

标签: c debugging runtime-error

我正在研究在线评判的问题(链接here),每次提交解决方案时,我都会收到运行时错误判断。我一直在看它一段时间,我仍然无法弄清楚它有什么问题。我还查看了运行时错误背后的典型原因(数组超出绑定,超出内存限制,逻辑错误等等)。我在下面发布的代码中找不到任何一个:

#include<stdio.h>

int Hall[110][110];

int isValid(int x, int y){
int i,j,cnt=0;

for(i=x-1; i<=x+1; i++)
    for(j=y-1; j<=y+1; j++)
            if(Hall[x][y]==Hall[i][j])
                cnt++;  
if(cnt>1)
    return 0;
else
    return 1;
}

int notChecked(int N,int* checked,int size){
  int i;

  for(i=0; i<size; i++)
     if(checked[i] == N)
        return 0;

  return 1;
}

int main (void){
  int T,R,C,checked[110],i,j,k,size;

  scanf("%d",&T);
  for(i=0; i<T; i++){
    scanf("%d %d",&R,&C);
    //initialize
    size=0;
    for(j=0; j<R*C; j++)    checked[j] = -1;
    for(j=0; j<=C+1; j++){
            Hall[0][j] = -1;
            Hall[R+1][j] = -1;
    }
    for(j=0; j<=R+1; j++){
            Hall[j][0] = -1;
            Hall[j][C+1] = -1;
    }
    //read input
    for(j=1; j<=R; j++)
        for(k=1; k<=C; k++)
            scanf("%d",&Hall[j][k]);

    //algo:
    for(j=1; j<=R; j++)
        for(k=1; k<=C; k++)
            if(Hall[j][k]>=0){
                if(notChecked(Hall[j][k],checked,size)){
                    if(isValid(j,k)==0){
                        checked[size] = Hall[j][k];
                        size++;
                    }
                }
            }

    printf("%d\n",size);
}

return 0;}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

您需要对输入进行边界检查。

根据网站T需要介于1到100之间,所以您需要检查一下。然后,对于网站上的每个RCNM),它们也需要介于1和100之间。

对于每组RC条目,您需要确保实际读入R行和C列。您还需要确保阅读T个总条目。

答案 1 :(得分:0)

解决了问题!

代码中包含一个没有债券问题的数组,如下所示:

for(j=0; j<R*C; j++)    checked[j] = -1;

知道检查的尺寸为110,R和C的最大尺寸为100。我将check的大小更改为10100并且有效。

感谢@chux的帮助!