为什么我的代码会出现运行时错误?

时间:2014-06-28 01:06:30

标签: c runtime

我花了3个小时来获得解决问题和代码的逻辑。但现在我

收到此运行时错误。谁能帮助我知道我在做什么错误? 编辑:它现在正在运行,但没有打印任何东西。

http://ideone.com/2YlS9J

#include <stdio.h>
#include<math.h>

float distance(float n1,float m1,float n2,float m2){
   float d=0;float sum=0;
   d =sqrt(pow(m2-m1,2)+pow(n2-n1,2));
   sum+=d;
   printf("%.2f",sum);
   return sum;
}

int main(void) {
   int t,n,i,j;float sum=0;
   scanf("%d",&t);
   while(t--){
      scanf("%d",&n);
      int r=0,s=0,a=0,b=0;
      int x[n],y[n],p[n],q[n],min[n],max[n];
      for(i=0;i<n;i++){
         scanf("%d %d",&x[i],&y[i]);}

      for(j=0;j<10001;j++){
         for(i=0;i<n;i++){
            if(j==x[i]){
               p[r++]=x[i];q[s++]=y[i];
            }
         }}
         for(i=0,j=i+1;i<n,j<n;i++,j++){
            if(p[i]==p[j]){
               if(q[i]>q[j]){min[a++]=p[i]; max[b++]=q[i];}
               else{min[a++]=p[i]; max[b++]=q[j];}
            }
            else{min[a++]=p[i]; max[b++]=q[i];}
         }

      for(i=0;i<n;i++){
         distance(min[i],max[i],min[i+1],max[i+1]);
      }

   }
}

3 个答案:

答案 0 :(得分:1)

正如@YePhicK所说,我强调, 学会使用调试器 。 不要依赖猜测或只是眼球。

那就是说,我看到的东西,除非你真的知道你在做什么,否则肯定要打破。

你有一个使用j作为索引变量的循环。 然后在其中,你有另一个循环,它也使用j作为索引变量。

      for(j=0;j<10001;j++){  // <----- j used here
         for(i=0;i<n;i++){
            if(j==x[i]){
               p[r++]=x[i];q[s++]=y[i];
            }
         }
         for(i=0,j=i+1;i<n,j<n;i++,j++){  // <----- j used here
            if(p[i]==p[j]){
               if(q[i]>q[j]){min[a++]=p[i]; max[a++]=q[i];}
               else{min[a++]=p[i]; max[a++]=q[j];}
            }
            else{min[a++]=p[i]; max[a++]=q[i];}
         }
      }

此外,您使用的是名为minmax的数组。 有一些普遍接受的宏称为minmax,所以如果你重新定义那些你会冒名字冲突的风险。

此外,在像这样的代码中

{
  min[a++]=p[i];
  max[a++]=q[i];
}

通过两次递增min,您似乎将空格放入数组maxa

答案 1 :(得分:0)

这一行:

        int x[n],y[n],p[n],q[n],min[n],max[n];

不正确。在C / C ++中,您不能声明可变大小的普通数组(不像在Basic中)。在编译时必须知道这样一个数组的大小

可能的解决方案是:

  1. 使用动态内存(malloc() / free()
  2. 使用具有设置的最大大小的静态分配的数组(并且存在缓冲区溢出和内存损坏的风险,或确保使用不超过已分配的空间)< / LI>
  3. 使用std::vector<int>

答案 2 :(得分:0)

for(i=0,j=i+1;i<n,j<n;i++,j++)

上面的for()语句包含以下(无意义的)条件表达式:

i<n,j<n  

将此更改为以下之一:

i<n || j<n

或:

i<n && j<n

此外,变量'float sum = 0;'在'main()'中未使用;和main()最后应该包括'return(0);'或类似的东西。