2016-05-04 6 views
0

このコードは、はるかに大きなプログラムの一部です。そこmain機能は、コード内にあり、それはその厄介な場合は申し訳ありませんが、細かい動作します。関数Quick_mode_timeの2番目のwhileループでは、セグメント化エラーが発生します。これを引き起こすために配列をどのように乱しているのか分かりません。もし誰かが私を正しい方向に向けることができたら、私はとても幸せになるでしょう!セグメンテーション違反ループC99

#include <stdio.h> 
#include <time.h> 
#include <math.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <stdbool.h> 

#define timing_start() start = clock(); 
#define timing_end(f) msec = (double)(clock()-start) * 1000000.0 /CLOCKS_PER_SEC; \ 
    printf("Calling "#f " takes %10.2f microseconds!\n", msec); 

void Quick_mode_time() 
{ 
    srand(time(NULL)); 
    int end=500,final=5000; 
    int a[end],beginning=0; 
    double t1,t2,t_tot; 
    printf("***************COMPARISON***************\n"); 

    printf("    quicksort  bubblesort  (in microseconds)\n"); 
    while(end!=final){ 

     while(beginning<end) 
     { 
      a[beginning]=rand()%end; // <--- This causes a segmentation fault 
      beginning++; 
     } 
     printf("N=%d",end); 

     t1=clock(); 
     quicksort_time(a,0,end); 

     t2=clock(); 
     t_tot= (double)(t2-t1)*1000/CLOCKS_PER_SEC; 
     printf("\t%7.3f\t", t_tot); 
     end+=500; 
    } 
} 

void quicksort_time(int x[],int first,int last){ 
    int pivot,j,temp,i; 
    // The Quick Sorting algorithim is below! 
    if(first<last){ 
     pivot=first; 
     i=first; 
     j=last; 

     while(i<j){ 
      while(x[i]<=x[pivot]&&i<last) 
       i++; 
      while(x[j]>x[pivot]) 
       j--; 
      if(i<j){ 
       temp=x[i]; 
       x[i]=x[j]; 
       x[j]=temp; 
      } 
     } 

     temp=x[pivot]; 
     x[pivot]=x[j]; 
     x[j]=temp; 
     quicksort_time(x,first,j-1); 
     quicksort_time(x,j+1,last); 
    } 
} 
+2

あなたが失敗している行を決定するためにデバッガを使用しました:aは十分な大きさであるように、

一つの修正があなたの宣言を変更するだろうか? – MikeCAT

+0

セグメンテーション違反が発生した場所を言うのコード内のコメントがあります。どのようなOP end'が増加する 'として配列' [終了]は 'サイズが増加しないことを知っているようではありません。 – user3386109

+0

'end + 1-end'は' 1'です。これがあなたが望むものだと確信していますか? – MikeCAT

答えて

2

この行:

int a[end] 

がOKであるa[beginning]

このライン

a[beginning]=rand()%(end+1-end)+end; 

を書き込む(端部が前ライン500に設定されている)500個のintの配列を作成限りあるbeginningとして500未満

このように見えますすぐ上の行でチェックするS:

while(beginning<end) 

が、後に自分のコードで、あなたが持っている:

end+=500; 

突然、終わりは始まりを意味し、> 500することができ>は500することができつまり、配列の境界の外側に書き込むということです。

int a[final] 
+0

THANKS私は今、この権利をテストします! –

+0

ありがとうございました! –

0

あなたがendまたはfinalの値を変更することはありませんので、あなたの外側のwhileループが終了したことがありません。

+1

最後の括弧500 –

関連する問題