ошибка сегментации при использовании gsl_rng_uniform - PullRequest
1 голос
/ 29 марта 2012

Я пишу программу, которая использует генератор случайных чисел 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 как иногда ноль, иногда 0xa. Я не уверен почему. Я думаю, это может быть связано с аргументом const-указателя на функцию gsl_rng_uniform, как описано здесь .

Вот вывод отладчика:

Program received signal SIGSEGV, Segmentation fault.
gsl_rng_uniform (r=0x0) at ../gsl/gsl_rng.h:167
167 ../gsl/gsl_rng.h: No such file or directory.
    in ../gsl/gsl_rng.h
(gdb) backtrace
#0  gsl_rng_uniform (r=0x0) at ../gsl/gsl_rng.h:167
#1  0x0000000000400d97 in shuffle_two (r=0x0, deck=0x7fffffffdfd0)
    at blackjack.cpp:55
#2  0x0000000000400cad in main () at blackjack.cpp:33
(gdb)
...