代码之家  ›  专栏  ›  技术社区  ›  Grzenio

分段故障

  •  1
  • Grzenio  · 技术社区  · 15 年前

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

    #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 回复  |  直到 15 年前
        1
  •  3
  •   Anycorn    15 年前

    检查是否 rn 已经被分配了。这可能是唯一可能导致分段错误的事情。

    我在我的电脑上测试了你的代码,据他们所知,它运行正常。可能是检查GSL的安装,他们有一个测试套件可以使用

        2
  •  1
  •   anon    15 年前

    在:

    double x;
    double y;
    rng.bivariateGaussian(rho, x, y);
    

    x和y是否应该是数组而不是单变量?我希望一个分布产生n个值,而不是一个(或两个)。

        3
  •  1
  •   Omnifarious    15 年前

    哪个编译器?我认为 rn 是RandomNumberGenerator的成员变量。是否在构造函数中将其初始化为0?您似乎没有检查gsl-rng-alloc的错误返回,您可能应该检查,因为我现在唯一能看到可能导致问题的是 没有指向任何有效的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 要启动所有优化?

        4
  •  0
  •   Alfred    15 年前

    我不编程C++,但希望这对你也适用。但在C上,我有时使用像gdb这样的调试器或Eclipse中的调试器。我也用 valgrind (我非常喜欢这个工具)修复内存泄漏/分段错误。我建议你喜欢这个 tutorial 为了更好地了解Valgrind能为您做些什么。Valgrind可以做的更多,所以我建议你阅读Valgrind/Helgrind。

        5
  •  0
  •   Grzenio    15 年前

    谢谢大家的回答。这个bug在我没有粘贴的代码中:(我传递了一个randomNumberGenerator实例作为一个普通参数。当我把它改为作为参考传递时,它开始神奇地工作。