对于循环,大量崩溃了

for loop is crashing on big number

本文关键字:崩溃 于循环 循环      更新时间:2023-10-16

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

我的问题是,每当我尝试将数字n增加到例如int n = 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;
}

您的问题是双重的。

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

2)您在访问该数组时很可能会出现在数组的外部。

要解决第一个问题,这条代码不是标准的C 。

int lwKomorkach[n-1];

必须以编译时常数声明C 中的数组。另外,如果n-1很大,您的风险超过了保留的堆栈空间的量。

减轻这种方法的方法是使用std::vector

#include <vector>
//...
std::vector<int> lwKomorkach(n-1);

拥有此功能后,为了确保您不会走出来,可以使用std::vector::at()功能检查界限:

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

如果i超出了界限,您将获得std::out_of_range例外,而不是"崩溃"或更糟,不会崩溃,并且认为您的程序确实无法正常工作时可以正常工作。您应该在其他for循环中应用相同的测试。

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

最后一个问题是使用qsort。改用std::sortstd::sort更易于使用(整个地方都没有铸造),可以更容易地优化编译器,并且可以适用于任何类型(而qsort仅适用于POD或C兼容类型)。

)。 )。
#include <algorithm>
//...
std::sort(lwKomorkach.begin(), lwKomorkach.end());

由那个

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

您正在尝试将n个项目放入N-1大小数组中。我想它并没有偶然地以低数字崩溃。

,在第二循环时会变得更糟

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

当z = n-1时,您正在尝试分配给lwkomorkach [n],而lwkomorkach的最大索引可以是n-2