簡體   English   中英

分段故障

[英]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個值,而不是一個(或兩個)。

我不編程c ++,但我不編程C。希望這在某種程度上也適用於您。 但是在CI上有時會使用GDB等調試器或Eclipse中的調試器。 我還使用valgrind (我非常喜歡這個工具)來修復內存泄漏/分段錯誤。 我建議您喜歡本教程 ,以更好地了解valgrind可以為您做什么。 Valgrind可以做更多的事情,所以我建議您閱讀有關valgrind / helgrind的文章。

謝謝大家的回答。 該錯誤存在於我未粘貼的代碼段中:(我正在將RandomNumberGenerator的實例作為常規參數傳遞。當我將其更改為作為引用傳遞時,它開始神奇地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM