[英]Segmentation fault
这可能是一个愚蠢的问题,但是我看不到我在做什么错。 我上课:
#include <sys/time.h>
#include <gsl/gsl_cdf.h>
#include <gsl/gsl_randist.h>
#include <cmath>
#include "randomnumbergenerator.h"
class RandomNumberGenerator
{
gsl_rng * rn;
public:
RandomNumberGenerator();
~RandomNumberGenerator();
double univariate();
void bivariateGaussian(double rho, double &x, double &y);
};
long currentMicroseconds()
{
struct timeval now;
gettimeofday(&now, NULL);
return now.tv_usec;
}
RandomNumberGenerator::RandomNumberGenerator()
{
const gsl_rng_type * T;
gsl_rng_env_setup();
//T = gsl_rng_default;
T = gsl_rng_mt19937;
rn = gsl_rng_alloc (T);
gsl_rng_set(rn,currentMicroseconds());
}
double RandomNumberGenerator::univariate()
{
return gsl_rng_uniform(rn);
}
void RandomNumberGenerator::bivariateGaussian(double rho, double &x, double &y)
{
gsl_ran_bivariate_gaussian (rn, 1.0, 1.0, rho, &x, &y);
}
RandomNumberGenerator::~RandomNumberGenerator()
{
gsl_rng_free (rn);
}
我从这里打电话:
double x;
double y;
rng.bivariateGaussian(rho, x, y);
但是我在gsl_ran_bivariate_gaussian (rn, 1.0, 1.0, rho, &x, &y);
上gsl_ran_bivariate_gaussian (rn, 1.0, 1.0, rho, &x, &y);
了分割错误
任何想法?
检查是否真的分配了rn
。 这可能是唯一会导致分段错误的原因。
我在计算机上测试了您的代码,据他们所知,它可以正常运行。 可能是检查GSL的安装,他们有一个可以使用的测试套件
哪个编译器? 我假设rn
是RandomNumberGenerator的成员变量。 您是否在构造函数中将其初始化为0? 您似乎似乎没有在检查是否从gsl_rng_alloc返回错误,这可能是因为我可以立即看到的唯一可能导致问题的原因是,如果rn
在指向段错误的调用时未指向任何有效内容。
查看gsl_rng_alloc
的手册,您可以检查它是否返回NULL
或0,然后返回异常。 例如:
#include <stdexcept>
RandomNumberGenerator::RandomNumberGenerator()
{
const gsl_rng_type * T;
gsl_rng_env_setup();
//T = gsl_rng_default;
T = gsl_rng_mt19937;
rn = gsl_rng_alloc (T);
if (rn == 0) {
throw ::std::runtime_error("Failed to allocation a random number generator.");
}
gsl_rng_set(rn,currentMicroseconds());
}
另外,您是否尝试过使用-O0
进行编译以进行所有优化?
在:
double x;
double y;
rng.bivariateGaussian(rho, x, y);
x和y可能应该是数组而不是单个变量? 我希望分布产生N个值,而不是一个(或两个)。
谢谢大家的回答。 该错误存在于我未粘贴的代码段中:(我正在将RandomNumberGenerator的实例作为常规参数传递。当我将其更改为作为引用传递时,它开始神奇地工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.