1

これはおそらくばかげた質問ですが、ここで何が間違っているのかわかりません。私はクラスを持っています:

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

何か案が?

4

5 に答える 5

3

rnが本当に割り当てられているかどうかを確認します。セグメンテーション違反を引き起こす可能性があるのは、おそらくこれだけです。

私のコンピューターであなたのコードをテストしました。GSLのインストールを確認してください。使用できるテストスイートがあります

于 2010-01-24T19:32:05.537 に答える
1

どのコンパイラ?RandomNumberGeneratorrnのメンバー変数だと思います。コンストラクタで0に初期化しますか? gsl_rng_alloc からのエラー リターンをチェックしていないようです。問題を引き起こしている可能性があるとすぐにわかる唯一のことは、rnセグメンテーション フォールトしている呼び出しで有効なものを指していない場合だけです。

マニュアルをgsl_rng_alloc見ると、それがまたは0を返すかどうかを確認し、NULLそうでない場合は例外をスローできます。例えば:

#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また、すべての最適化をオフにしてコンパイルしようとしましたか?

于 2010-01-24T19:28:42.873 に答える
1

の:

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

x と y は、おそらく単一の変数ではなく配列であるはずですか? 分布が 1 つ (または 2 つ) ではなく、N 個の値を生成することを期待しています。

于 2010-01-24T19:40:08.773 に答える
0

私は C++ をプログラムしていませんが、C です。ただし、CI では、GDB のようなデバッガーや Eclipse のデバッガーを使用することがあります。また、valgrind (このツールがとても気に入っています) を使用して、メモリ リークやセグメンテーション エラーを修正しています。 valgrind でできることをよりよく理解するために、このチュートリアルを気に入っていただけることをお勧めします。Valgrind はさらに多くのことができるので、valgrind/helgrind について読むことをお勧めします。

于 2010-01-24T20:10:54.347 に答える
0

皆さんの回答に感謝します。バグは、貼り付けなかったコード部分にありました:( RandomNumberGenerator のインスタンスを通常のパラメーターとして渡していました。参照として渡すように変更すると、魔法のように機能し始めました。

于 2010-01-24T21:21:20.543 に答える