GSL の乱数ジェネレーターを使用するプログラムを作成しています。乱数ジェネレーターのインスタンスを関数に渡そうとすると、セグメンテーション エラーが発生します。ここに私のソースコードがあります:
int main(void)
{
gsl_rng *r;
int deck[52];
int count = 0;
r = gsl_rng_alloc(gsl_rng_mt19937);
gsl_rng_set(r, time(NULL));
// Initialize a custom deck
// code omitted...
// Perform trials
for (int j = 0; j < NUMTRIALS; j++) {
shuffle_two(r, deck);
if (deck[NUMCARDS-1] + deck[NUMCARDS-2] == 11)
count++;
}
// Report result
cout << fixed << setprecision(6) << count/static_cast<double>(NUMTRIALS);
cout << endl;
gsl_rng_free(r);
}
void shuffle_two(gsl_rng* r, int deck[])
{
double u;
int bottom, random;
int temp_card;
for (int i = 0; i < 2; i++) {
u = gsl_rng_uniform(r);
//code for shuffling goes here
}
}
アルゴリズムの実行中に r の値が変化していることは明らかです。バックトレースを実行すると、r が null になることもあれば、0xa になることもあります。理由はわかりません。here に記載されているように、 gsl_rng_uniform 関数への const ポインター引数と関係があると思います。
デバッガーの出力は次のとおりです。
プログラム受信信号 SIGSEGV、セグメンテーション違反。 gsl_rng_uniform (r=0x0) at ../gsl/gsl_rng.h:167 167 ../gsl/gsl_rng.h: そのようなファイルまたはディレクトリはありません。 ../gsl/gsl_rng.h で (gdb) バックトレース #0 gsl_rng_uniform (r=0x0) at ../gsl/gsl_rng.h:167 #1 0x0000000000400d97 in shuffle_two (r=0x0, デッキ=0x7ffffffffdfd0) blackjack.cpp:55 で #2 0x0000000000400cad in main () at blackjack.cpp:33 (gdb)