Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 插入排序导致分段错误:缩放后为11_C++_Syntax - Fatal编程技术网

C++ 插入排序导致分段错误:缩放后为11

C++ 插入排序导致分段错误:缩放后为11,c++,syntax,C++,Syntax,我编写了一个简单的插入排序实现,试图打破对的信任,并开始我希望更好地理解一般的算法。该文件包含2000万个随机数。代码如下: #include <fstream> #include <time.h> #include <cstdlib> using namespace std; void insertionSort(double numbers[], int array_size); int main() { int count; dou

我编写了一个简单的插入排序实现,试图打破对的信任,并开始我希望更好地理解一般的算法。该文件包含2000万个随机数。代码如下:

#include <fstream>
#include <time.h>
#include <cstdlib>

using namespace std;

void insertionSort(double numbers[], int array_size);

int main() {
    int count;
    double twentyMMNumbers[20000000];
    ifstream inputFile;
    time_t now;
    time(&now);

    inputFile.open("20KRandomsNumbers.data");       //Opens input file
    if(inputFile.fail())
    {
        printf("Cannot open inputFile");
        exit(1);
    }

    count = 0;
    printf("%d\n",count);
    inputFile >> twentyMMNumbers[count];
    printf("%f\n",twentyMMNumbers[count]);
    while(inputFile)
    {   //While loop
        count++;
        if(count < 20000000)
            inputFile >> twentyMMNumbers[count];
    }
    inputFile.close();  

    printf("%s\n", ctime(&now));    //BEFORE
    insertionSort(twentyMMNumbers, 20000000); //Insertion Sort 20KRandomNumbers
    printf("%s\n", ctime(&now)); //AFTER
    for(int i = 0; i < count; i++)
        printf("%f\n",twentyMMNumbers[i]);  
}

void insertionSort(double numbers[], int array_size)
{
  int i, j, index;
  for (i=1; i < array_size; i++)
  {
    index = numbers[i];
    j = i;
    while ((j > 0) && (numbers[j-1] > index))
    {
      numbers[j] = numbers[j-1];
      j = j - 1;
    }
    numbers[j] = index;
  }
}
这是因为我增加了阵列的大小吗?
PS如果你有任何关于优化这个的建议,请随意指出

您的while循环有问题:

while(inputFile)
{   //While loop
    count++;
    if(count < 20000000)
        inputFile >> twentyMMNumbers[count];
}
while (inputFile) {   
    if (count >= dataSize) {

        break;
    }
    inputFile >> twentyMMNumbers[count];
    count++;
}
inputFile.close();  
while(输入文件)
{//While循环
计数++;
如果(计数<20000000)
输入文件>>二十毫米数字[计数];
}

只有当文件包含while循环出现问题时,此循环才会终止:

while(inputFile)
{   //While loop
    count++;
    if(count < 20000000)
        inputFile >> twentyMMNumbers[count];
}
while (inputFile) {   
    if (count >= dataSize) {

        break;
    }
    inputFile >> twentyMMNumbers[count];
    count++;
}
inputFile.close();  
while(输入文件)
{//While循环
计数++;
如果(计数<20000000)
输入文件>>二十毫米数字[计数];
}
只有当文件包含时,此循环才会终止。具有讽刺意味的是(给定此站点名称),您的堆栈溢出。您需要在堆上动态分配这么多内存

为了更清楚,这一行:

double twentyMMNumbers[20000000];
需要

double* twentyMMNumbers = (double*)malloc(20000000*sizeof(double));
当然,您需要在退出程序之前释放内存(作为最佳实践):

具有讽刺意味的是(给定此站点名称),您有一个堆栈溢出。您需要在堆上动态分配这么多内存

为了更清楚,这一行:

double twentyMMNumbers[20000000];
需要

double* twentyMMNumbers = (double*)malloc(20000000*sizeof(double));
当然,您需要在退出程序之前释放内存(作为最佳实践):


它适用于较小的数组大小,因此这里有一些注释(因为它在CodeReview上)和一些较大数组大小的修复

1,如果要使用固定大小的数组,请使用常量,而不是
200000
(或
20000000
)文本

2、使用动态数组更好。读取第一行后分配内存,并将读取的大小用作新数组的大小。此外,我会将数据文件的大小(文件的第一行)存储在单独的变量中,而不是存储在数组中

int dataSize;
inputFile >> dataSize;
double *twentyMMNumbers = new double[dataSize];
它分配确切的内存量。不多也不少

它还修复了分段错误。有关更多信息,请检查以下问题:

(不要忘记使用
delete[]
取消分配数组)

3、如果记录多于数组大小,则无需读取整个文件。我将修改while循环:

while(inputFile)
{   //While loop
    count++;
    if(count < 20000000)
        inputFile >> twentyMMNumbers[count];
}
while (inputFile) {   
    if (count >= dataSize) {

        break;
    }
    inputFile >> twentyMMNumbers[count];
    count++;
}
inputFile.close();  
也许退出(-1)和错误消息会比中断
更好

4、以下评论是不必要的:

//While loop
5,您应该将数组的实际大小传递给
insertionSort
函数,因此编写以下代码:

insertionSort(twentyMMNumbers, dataSize); 
这里的评论也没有必要

6、改进错误处理:当
dataSize
的值大于文件中的数字时会发生什么情况

7,我将使用最后一个
for
循环提取
printary
函数以及
readInput
函数

< P > 8,考虑使用C++样式打印代替代码> Prtff < /C> >:

cout << "Hello world!" << endl;

cout它适用于较小的数组大小,因此这里有一些注释(因为它在CodeReview上),以及一些针对较大数组大小的修复

1,如果要使用固定大小的数组,请使用常量,而不是
200000
(或
20000000
)文本

2、使用动态数组更好。读取第一行后分配内存,并将读取的大小用作新数组的大小。此外,我会将数据文件的大小(文件的第一行)存储在单独的变量中,而不是存储在数组中

int dataSize;
inputFile >> dataSize;
double *twentyMMNumbers = new double[dataSize];
它分配确切的内存量。不多也不少

它还修复了分段错误。有关更多信息,请检查以下问题:

(不要忘记使用
delete[]
取消分配数组)

3、如果记录多于数组大小,则无需读取整个文件。我将修改while循环:

while(inputFile)
{   //While loop
    count++;
    if(count < 20000000)
        inputFile >> twentyMMNumbers[count];
}
while (inputFile) {   
    if (count >= dataSize) {

        break;
    }
    inputFile >> twentyMMNumbers[count];
    count++;
}
inputFile.close();  
也许退出(-1)
和错误消息会比中断
更好

4、以下评论是不必要的:

//While loop
5,您应该将数组的实际大小传递给
insertionSort
函数,因此编写以下代码:

insertionSort(twentyMMNumbers, dataSize); 
这里的评论也没有必要

6、改进错误处理:当
dataSize
的值大于文件中的数字时会发生什么情况

7,我将使用最后一个
for
循环提取
printary
函数以及
readInput
函数

< P > 8,考虑使用C++样式打印代替代码> Prtff < /C> >:

cout << "Hello world!" << endl;

cout此站点用于查看工作代码。在stackoverflow上可以找到更好的修复代码的机会。我以前从未见过向stackoverflow的迁移。当然,托玛拉基雷特卡尔,比你想象的更普遍。“代码审查”会收到很多类似这样的代码帮助问题。@WinstonEwert:不管它值多少钱,它们也不是真正的帮助问题。:)此站点用于查看工作代码。在stackoverflow上可以找到更好的修复代码的机会。我以前从未见过向stackoverflow的迁移。当然,托玛拉基雷特卡尔,比你想象的更普遍。“代码审查”会收到很多类似这样的代码帮助问题。@WinstonEwert:不管它值多少钱,它们也不是真正的帮助问题。:)正如另一个答案所述,您也可以使用
new
。我错过了这是C++,不是C,所以我使用了<代码> Malc C/代码>。但是,在C++中,也可以使用另一个答案,也可以使用<代码>新< /C>。我错过了这是C++,不是C,所以我使用了<代码> Malc C/代码>。不过,两个都可以用C++来工作。