Почему мой код выдает ошибку во время выполнения?

#c #runtime

#c #время выполнения

Вопрос:

Мне потребовалось 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",amp;t);
   while(t--){
      scanf("%d",amp;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",amp;x[i],amp;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]);
      }

   }
}
 

Ответ №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];}
         }
      }
 

Кроме того, вы используете массивы с именем min и max .
Существуют общепринятые макросы, вызываемые min и max , поэтому, если вы переопределите их, вы рискуете столкнуться с конфликтом имен.

Кроме того, в коде, подобном этому

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

похоже, что вы помещаете пустые пробелы в массивы min и max увеличиваете a их в два раза.

Комментарии:

1. Спасибо, что уведомили меня о недостатках. Все еще ничего не печатаю. Загрузка отладчика занимает много времени.

2. @RachanaBagde: Запустите его под отладчиком, например, VC или GDB. Если вы не знаете, как это сделать, научитесь. Один шаг в нее, по одной строчке за раз. Отображение переменных. Вы не можете просто собрать кучу кода и ожидать, что он сработает, или ожидать, что другие программисты обнаружат все ваши ошибки.

3. Хорошо… сэр. Спасибо, что уделили мне время.

Ответ №2:

Эта строка:

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

неверно. В C / C вы не можете объявлять простые массивы переменного размера (в отличие, скажем, от Basic). Размер такого массива должен быть известен во время компиляции.

Возможные решения:

  1. Используйте динамическую память ( malloc() / free() )
  2. Используйте статически выделенные массивы с заданным максимальным размером (и либо рискуйте переполнением буфера и повреждением памяти, либо убедитесь, что вы используете не более выделенного вами пространства)
  3. Используйте std::vector<int>

Комментарии:

1. C99, в отличие от C , имеет поддержку VLA.

2. хорошо .. эта проблема решена, я дал константу. размер 100002. Теперь программа успешно запущена, но ничего не печатает. Что теперь не так ?

3. Вам действительно следует использовать отладчик для ответа на такие вопросы

4. hmm..so ты понятия не имеешь ?

5. Если вы не хотите использовать отладчик для поиска проблем в своем собственном коде, я не вижу причин, по которым кто -либо должен тратить время на попытки помочь вам

Ответ №3:

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

Приведенный выше оператор for() содержит следующее (бессмысленное) условное выражение:

 i<n,j<n  
 

Измените это значение на одно из следующих:

 i<n || j<n
 

или:

 i<n amp;amp; j<n
 

Кроме того, переменная ‘float sum = 0;’ в ‘main ()’ не используется; и main () должна включать ‘return (0);’ или что-то подобное в конце.