2016-07-13 6 views
1

Я пробовал подсчет сортировки и выполнял в «http://www.tutorialspoint.com/compile_c_online.php», и он работал отлично, но когда я попытался скомпилировать в «http://codepad.org», он сказал, что segmentation fault.i попытался использовать gdb, но он didnot показать любую ошибку. вот код, который может найти строку, вызывающую его.подсчет программы сортировки, показывающей ошибку в конкретных компиляторах в c

#include<stdio.h> 
int main(void) 
{ 
long long int t; 
int i=0,j,max,min,temp,pos; 
scanf("%lld",&t);//enter total numbers to be sorted 
long long int a[t]; 
while(i<t) 
    { 
     scanf("%lld",&a[i]); 
     if(i==0) max=min=a[i]; 
     else 
     { 
      if(a[i]>=max) max=a[i]; 
      if(a[i]<min) min=a[i]; 
     } 
     ++i; 
    } 
temp=(max-min+1); 
long long int b[temp]; 
for(i=0;i<t;i++) 
    for(j=min;j<=max;j++) 
     { 
     if(i==0) b[j-min]=0; 
     if(a[i]==j) ++b[j-min]; 
     } 
for(i=0;i<temp;i++) if(i!=0) b[i]=b[i]+b[i-1]; 
long long int c[t]; 
for(i=0;i<t;i++) 
{ 
    for(j=0;j<temp;j++) 
     { 
      if(a[i]==(j+min)) 
       { 
        pos=(b[j]-1); 
        c[pos]=j+min; 
        --b[j]; 
       } 
     } 
} 
for(j=0;j<t;j++) printf("%lld\n",c[j]); 
return(0); 
} 
+1

Это означает, что программа имеет неопределенное поведение. :) –

+0

Я новичок, вы можете сказать мне, какая строка вызывает это ??? – Bazooka47

+0

Скомпилируйте код в среде Linux с помощью gcc, затем запустите его под [valgrind] (http://valgrind.org). Если вы читаете/записываете память, которую вы не должны, она вам скажет. – dbush

ответ

0

Похоже, что codepad не поддерживает чтение пользовательского ввода:

#include<stdio.h> 
int main(void) 
{ 
long long int t; 
scanf("%lld",&t);//enter total numbers to be sorted 
printf("%lld\n",t); 
return 0; 
} 

Обеспечивает получение

Output: 
134513968 

входной сигнал не читается, но случайное число есть. С этим номером ваша программа сбой. Вот solution для C++.

+0

, если опубликованный код проверил возвращаемое значение (а не значение параметра) от каждого из вызовов до 'scanf()', тогда он обнаружил бы проблему с кодовым кодом, не позволяющим вводить пользовательские входы. Это просто еще один яркий пример того, что возвращаемые значения функции системы должны быть проверены на наличие ошибок. – user3629249

0

после применения изменений, перечисленных в комментариях к вопросу

следующие результаты код:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    long long int t; 
    int i=0; 
    long long int j; 
    long long int max; 
    long long int min; 
    long long int temp; 
    long long int pos; 

    printf("%s", "enter total numbers to be sorted"); 
    if(1 != scanf("%lld",&t)) 
    { 
     printf("%s\n","first scanf failed"); 
     exit(EXIT_FAILURE); 
    } 

    long long int a[t]; 

    for(i=0; i<t; i++) 
    { 
     printf("%s %d", "enter number: ", i); 
     if(1 != scanf("%lld",&a[i])) 
     { 
      printf("%s\n", "second scanf failed"); 
      exit(EXIT_FAILURE); 
     } 

     if(i==0) 
     { 
      max=min=a[i]; 
     } 

     else 
     { 
      if(a[i]>=max) 
      { 
       max=a[i]; 
      } 

      if(a[i]<min) 
      { 
       min=a[i]; 
      } 
     } 
    } 

    temp=(max-min+1); 

    long long int b[temp]; 

    for(i=0;i<t;i++) 
    { 
     for(j=min;j<=max;j++) 
     { 
      if(i==0) 
      { 
       b[j-min]=0; 
      } 

      if(a[i]==j) 
      { 
       ++b[j-min]; 
      } 
     } 
    } 

    for(i=0;i<temp;i++) 
    { 
     if(i!=0) 
     { 
      b[i]=b[i]+b[i-1]; 
     } 
    } 

    long long int c[t]; 

    for(i=0;i<t;i++) 
    { 
     for(j=0;j<temp;j++) 
     { 
      if(a[i]==(j+min)) 
      { 
       pos=(b[j]-1); 
       c[pos]=j+min; 
       --b[j]; 
      } 
     } 
    } 

    for(j=0;j<t;j++) 
    { 
     printf("%lld\n",c[j]); 
    } 


    return(0); 
} 

Примечание: Лучше использовать perror(), а не printf() для вывода сообщений об ошибках, но codepad будет затем не скомпилировать код по вызову sys_dup()

выход:

enter total numbers to be sorted 
first scanf failed 
+0

Примечание: при запуске на локальном компьютере, а не на веб-странице, он корректно работает – user3629249

+0

, чтобы избежать таких проблем в будущем. Я предлагаю использовать: 'http: // ideone.com /', который позволяет вам «предварительно определить», все пользовательские входы – user3629249

+0

Должен ли я использовать getchar для ввода цифр, а затем передать его требуемой переменной, если в этом случае scanf покажет ошибку ??? – Bazooka47