#c #runtime
#c #время выполнения
Вопрос:
Мне потребовалось 3 часа, чтобы получить логику для решения вопроса и соответствующего кода. Но теперь я
получение этой ошибки во время выполнения. Может кто-нибудь, пожалуйста, помочь мне узнать, какую ошибку я делаю? Редактировать: он работает сейчас, но ничего не печатает.
#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). Размер такого массива должен быть известен во время компиляции.
Возможные решения:
- Используйте динамическую память (
malloc()
/free()
) - Используйте статически выделенные массивы с заданным максимальным размером (и либо рискуйте переполнением буфера и повреждением памяти, либо убедитесь, что вы используете не более выделенного вами пространства)
- Используйте
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);’ или что-то подобное в конце.