这可能是一个愚蠢的问题,但我看不出我在这里做错了什么。我有课:
#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);
有什么想法吗?
答案 0 :(得分:3)
检查是否确实已分配rn
。它可能是导致分段错误的唯一因素。
我在我的电脑上测试了你的代码,它尽可能地运行正常。可以检查安装GSL,他们有一个可以使用的测试套件
答案 1 :(得分:1)
哪个编译器?我假设rn
是RandomNumberGenerator的成员变量。你在构造函数中将它初始化为0吗?您似乎没有检查gsl_rng_alloc的错误返回,您可能应该是因为我唯一可以看到的可能导致问题的是,如果rn
没有指向任何有效的称之为segfaulting。
查看manual for 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
进行编译以完成所有优化?
答案 2 :(得分:1)
在:
double x;
double y;
rng.bivariateGaussian(rho, x, y);
是x和y或许应该是数组而不是单个变量?我希望分布产生N值,而不是一个(或两个)。
答案 3 :(得分:0)
我不编程c ++,但是C.希望这也会适用于你。但是在C上我有时会使用像GDB这样的调试器或Eclipse中的调试器。我还使用valgrind(我非常喜欢这个工具)来修复内存泄漏/分段错误。我建议你喜欢这个tutorial,以便更好地了解valgrind能为你做些什么。 Valgrind可以做更多的事情,所以我建议你阅读valgrind / helgrind。
答案 4 :(得分:0)
感谢大家的回答。这个错误出现在我没有粘贴的代码中:(我将一个RandomNumberGenerator实例作为普通参数传递。当我将其更改为传递为参考时,它开始神奇地工作。