2012-11-25 26 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