分段故障

时间:2010-01-24 19:22:07

标签: c++ g++ segmentation-fault gsl

这可能是一个愚蠢的问题,但我看不出我在这里做错了什么。我有课:

#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);

上遇到了细分错误

有什么想法吗?

5 个答案:

答案 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实例作为普通参数传递。当我将其更改为传递为参考时,它开始神奇地工作。