对于循环,大量崩溃了
for loop is crashing on big number
我有问题。我必须编写一个程序来计算随机生成数字表的碰撞(碰撞测试)。例如,表[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::sort
。std::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
相关文章:
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- For 循环在尝试读取数组 c++ 时程序崩溃
- 在 mmap'ed 区域上使用 memcpy 崩溃,for 循环不会
- C++代码崩溃并具有无限循环
- 程序因 While 循环而崩溃
- 当通过tcp接收编码图像的消息时,zmq在第二个循环中崩溃
- 相同的 for 循环适用于其他项目,但不适用于此项目。为什么?
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- 我需要做一个空函数循环回来,而不会让它崩溃或跳过
- 如何避免在打印类似于"%q"的字符时在 vsprintf_s() 处崩溃
- 将函数应用于特征矩阵中的所有元素,而无需循环
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- 布雷森汉姆线抽屉在渲染任何内容之前经过一定循环后崩溃
- 循环导致文件崩溃
- Openmp-嵌套用于循环
- 有类似于循环(圆形)迭代器的东西吗?
- 我是否必须求助于循环,以比较C 中的两个2D阵列
- C++嵌套用于循环
- C++嵌套用于循环-内积-marix乘法
- 为什么for循环中定义的变量只存在于循环内部