2012-11-25 52 views
-1

使用從interwebs某處取得的代碼,我試圖在我的程序中實現一個基數排序功能。該程序的輸入是一個包含大約120萬長整數的文本文件。我已經有一個maxSize = 1200000的數組存儲文本文件中的整數,所以當我在radixSort函數中創建工作數組時,我得到一個seg錯誤。有沒有辦法避免這種情況?避免C++基數排序中的分段錯誤?

這裏的驅動程序代碼:

case 5: 
    //Sort using Radix Sort 
    startTime = clock(); 

     radixSort(array, size); 
     writeArray(radixFile, array, size); 
     radixFile.close(); 

    endTime = clock(); 
    timeUsed = (endTime-startTime)/(double)CLOCKS_PER_SEC; 
    cout << "Time elapsed: " << timeUsed << " seconds" << endl; 
    break; 

與這裏的功能

void radixSort(int *array,int size){ 

    int i,b[maxSize],m=0,exp=1; 

    for(i=0;i<size;i++){ 
     if(array[i]>m) 
      m=array[i]; 
    } 

    while(m/exp>0) 
    { 
     int bucket[10]={0}; 

     for(i=0;i<size;i++) 
      bucket[array[i]/exp%10]++; 

     for(i=1;i<10;i++) 
      bucket[i]+=bucket[i-1]; 

     for(i=size-1;i>=0;i--) 
      b[--bucket[array[i]/exp%10]]=array[i]; 

     for(i=0;i<size;i++) 
      array[i]=b[i]; 

     exp*=10; 
    } 
} 

也,數組創建的主要摘錄:

int main(){ 

     int choice, size=0, x=0; 
     int *array = NULL; 
     array = new int[maxSize]; 

並在尺寸確定:

void readArray(ifstream &inputFile, int arr[], int &size){ 
size = 0; 
while (inputFile >> arr[size]){ 
    size++; 
}} 
+0

關於哪條線路故障?程序崩潰時,局部變量是什麼? 'size'強制小於或等於'maxSize'在哪裏?它實際上是在創建'b'時嗎?如果是這樣,您可能需要更大的堆棧大小,或者您可能需要堆分配它。 – rutgersmike

+0

我使用Code :: Blocks作爲編譯器,在哪裏可以找到有關故障的信息?大小由readArray函數確定,該函數將文本文件中的長整數存儲到數組中。 – user1850486

+0

Code :: Blocks是一個IDE,而不是編譯器。您需要在調試器中運行該程序,或通過它運行生成的核心轉儲。不幸的是,調試器既不是編譯器也不是IDE。 – rutgersmike

回答

1

1200000 INT至少需要120萬*1024分之4^ 2 = 4.7 MIB和你聲明你的堆棧,這可能不是足夠的堆棧大小的數組...

你試過聲明b []在堆上嗎?

嘗試

int *b = new int[maxSize]; 

,而不是

int b[maxSize]; 
+0

是的,我早些時候嘗試過,但我仍然收到了一個seg。執行中的錯誤。 – user1850486

0

你沒有正確地讀取文件。您應該檢查EOF,因爲提取操作員總是返回您提供給它的流(請參閱http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/)。你很可能會破壞這裏的記憶,在此之後所有的投注都關閉。請嘗試:

while (!inputFile.eof() && size<maxSize) 
{ 
    inputFile >> arr[size++]; 
} 
+0

我根據您的建議更正了readArray函數,但遺憾的是我仍然收到一個SIGSEGV信號。調試器以#0作爲main()和#1打開調用堆棧,如下所示:\t \t \t \t bucket [array [i]/exp%10] ++; – user1850486

+0

'array [i]','i',&exp'的值是什麼? – rutgersmike

+0

我假設這些是運行調試器後手表中列出的值。在這種情況下,我顯示爲0,exp顯示爲1.我不確定在哪裏查找數組[i],但數組是0x7ffff6d79010。我在for循環的行上放置了一個斷點,在發生seg故障的行之前,它似乎在第一個run-through上給出了seg故障。 – user1850486