Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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++ for循环正在大数字上崩溃_C++_Loops_For Loop_Random_Gsl - Fatal编程技术网

C++ for循环正在大数字上崩溃

C++ for循环正在大数字上崩溃,c++,loops,for-loop,random,gsl,C++,Loops,For Loop,Random,Gsl,我有个问题。我必须编写一个程序来统计随机生成的数字表的冲突(冲突测试)。例如,表[1,2,2,3,4,5,5,6]有3次碰撞 我的问题是,每当我试图将数字n增加到例如intn=5191401我的程序崩溃。发生了什么事?为什么它停止工作?我需要大量的随机数(比如10^14) 这是我的密码: #include <iostream> #include <gsl/gsl_rng.h> #include <stdlib.h> #include<cmath>

我有个问题。我必须编写一个程序来统计随机生成的数字表的冲突(冲突测试)。例如,表[1,2,2,3,4,5,5,6]有3次碰撞

我的问题是,每当我试图将数字
n
增加到例如
intn=5191401我的程序崩溃。发生了什么事?为什么它停止工作?我需要大量的随机数(比如10^14)

这是我的密码:

#include <iostream>
#include <gsl/gsl_rng.h>
#include <stdlib.h>
#include<cmath>

using namespace std;

int compare(const void * a, const void * b)
{
    return ( *(int*)a - *(int*)b );
}

int main (void)
{
    unsigned int seed=10540000;
    gsl_rng * r=gsl_rng_alloc (gsl_rng_minstd);
    gsl_rng_set(r,seed);
    gsl_rng_env_setup();
    int lPrzedzialow=400000000;
    int n = 519140;
    int z,lKolizji=0;
    int lwKomorkach[n-1];
    double dlPrzedzialu=1./(lPrzedzialow);

    for (int i = 0; i < n; i++)
    {
        lwKomorkach[i]=floor(gsl_rng_uniform (r)/dlPrzedzialu)+1;
    }

    qsort (lwKomorkach, n, sizeof(int), compare);

    for(z=0;z<=n-1;z++)
    {
        if(lwKomorkach[z+1]==lwKomorkach[z])
        {
            lKolizji++;
        }
    }

    cout<<endl<<lKolizji<<endl;
    gsl_rng_free (r);

    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
整数比较(常数无效*a,常数无效*b)
{
返回(*(int*)a-*(int*)b);
}
内部主(空)
{
无符号整数种子=10540000;
gsl_rng*r=gsl_rng_alloc(gsl_rng_minstd);
gsl_rng_集(r,种子);
gsl_rng_env_setup();
int lPrzedzialow=400000000;
int n=519140;
intz,lKolizji=0;
国际lwKomorkach[n-1];
双dlPrzedzialu=1./(lPrzedzialow);
对于(int i=0;i
int lwKomorkach[n-1];

for (int i = 0; i < n; i++)
{
    lwKomorkach[i]=floor(gsl_rng_uniform (r)/dlPrzedzialu)+1;

}
intlwkomorkach[n-1];
对于(int i=0;i
您正在尝试将n个项目放入n-1大小的数组中。我猜它并不是偶然在低数量时崩溃的

第二圈的情况更糟

for(z=0;z<=n-1;z++)
{
    if(lwKomorkach[z+1]==lwKomorkach[z]){lKolizji++;}
}
for(z=0;z)

int lwKomorkach[n-1];

for (int i = 0; i < n; i++)
{
    lwKomorkach[i]=floor(gsl_rng_uniform (r)/dlPrzedzialu)+1;

}
intlwkomorkach[n-1];
对于(int i=0;i
您正在尝试将n个项目放入n-1大小的数组中。我猜它并不是偶然在低数量时崩溃的

第二圈的情况更糟

for(z=0;z<=n-1;z++)
{
    if(lwKomorkach[z+1]==lwKomorkach[z]){lKolizji++;}
}

for(z=0;z您的问题是双重的

1)在声明数组时使用非标准C++语法。

2) 访问数组时,很可能超出了数组的范围

为了解决第一个问题,这段代码不是标准的C++。
int lwKomorkach[n-1];

C++中的数组必须用编译时常数声明。如果代码很大,则超出了保留堆栈空间的数量。 缓解这种情况的方法是使用

std::vector

#include <vector>
//...
std::vector<int> lwKomorkach(n-1);
如果
i
超出范围,您将得到一个
std::out_of_range
异常,而不是“崩溃”或更糟的情况,即没有崩溃,并且认为您的程序在实际运行不正常的情况下正常运行。您应该在另一个
for
循环中应用相同的测试

解决边界问题后,可以将代码从
at()
更改为使用
[]
,因为边界错误已得到解决

最后一个问题是
qsort
的使用。改用
std::sort
std::sort
更易于使用(无需到处强制转换),编译器可以更容易地优化,并且可以适用于任何类型(而
qsort
仅适用于POD或
C
兼容类型)

#包括
//...
排序(lwKomorkach.begin(),lwKomorkach.end());

您的问题有两个方面

1)在声明数组时使用非标准C++语法。

2) 访问数组时,很可能超出了数组的范围

为了解决第一个问题,这段代码不是标准的C++。
int lwKomorkach[n-1];

C++中的数组必须用编译时常数声明。如果代码很大,则超出了保留堆栈空间的数量。 缓解这种情况的方法是使用

std::vector

#include <vector>
//...
std::vector<int> lwKomorkach(n-1);
如果
i
超出范围,您将得到一个
std::out_of_range
异常,而不是“崩溃”或更糟的情况,即没有崩溃,并且认为您的程序在实际运行不正常的情况下正常运行。您应该在另一个
for
循环中应用相同的测试

解决边界问题后,可以将代码从
at()
更改为使用
[]
,因为边界错误已得到解决

最后一个问题是
qsort
的使用。改用
std::sort
std::sort
更易于使用(无需到处强制转换),编译器可以更容易地优化,并且可以适用于任何类型(而
qsort
仅适用于POD或
C
兼容类型)

#包括
//...
排序(lwKomorkach.begin(),lwKomorkach.end());

10^14比普通整数所能容纳的要大得多。您可能需要一个无符号的\uu int64。请参阅此处的整数限制:n=519150远未接近整数限制,对我无效;<我尝试将其重新设置为长整数、双倍整数,但这些都不起作用。我也尝试了无符号整数,但对更大的整数仍然无效n@Sarah停止做t他: INTWLKOMORKACH[N-1];这不是标准C++。使用<代码> STD::向量< /代码>,如果你的问题消失了,我不会感到惊讶。你使用的是“可变长度数组”。这是NunStad,而且很可能是用它们来吹栈。使用标准C++,<代码> STD::vector < /COD> >莎拉。它不仅详细解释了<>代码> N< /代码>的问题,而且如何用<代码>()来解决你自己关于边界条件的问题。
。同时退出使用
qsort
并使用
std::sort
int n=519140;int lwKomorkach[n];
-->可能会导致堆栈溢出….10^14比正常整数所能容纳的要大得多。您可能需要一个无符号的int64。请参阅此处的整数限制:n=519150远未接近整数限制,对我不起作用;<我尝试将其重新设置为long、double,这些都不起作用。我也尝试了无符号,但仍然不起作用为更大的公司工作n@Sarah停止这样做:<代码> int LWKOMORKACH[N-1 ];< /Cord>这不是标准C++。使用<代码> STD::向量< /代码>,如果你的问题消失了,我不会感到惊讶。