Я пытаюсь написать оболочку для использования библиотеки gsl с Fortran. Мне удалось заставить работать простую оболочку - пример из http://www.helsinki.fi/~fyl_tlpk/luento/ohj-13-GSL-e.html
Код Фортрана
program gsltest
implicit none
real(kind=selected_real_kind(12)) :: a = 0.11, res
external :: glsgateway
call gslgateway(a,res)
write(*,*) 'x', a, 'atanh(x)', res
end program gsltest
функция c
#include <gsl/gsl_math.h>
void gslgateway_(double *x, double *res){
*res = gsl_atanh(*x);
}
Это все хорошо. Однако у меня проблемы с более сложной оболочкой. У меня следующий код изменен из примера на http://apwillis.staff.shef.ac.uk/aco/freesoftware.html
Обертка c (rng_initialise.c)
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
static gsl_rng* r;
void rng_initialise__(int* s) {
r = gsl_rng_alloc(gsl_rng_taus);
gsl_rng_set(r, (unsigned long int)(*s));
}
Фортран основной (main.f90)
PROGRAM main
integer seed
call system_clock(seed)
WRITE (*,*) 'calling rng_initialise'
call rng_initialise(seed)
END PROGRAM main
который я затем компилирую и связываю по
gcc -c rng_initialise.c
g95 -c main.f90
g95 -o main main.o rng_initialise.o -L/usr/libs -lgsl
Когда я запускаю эту программу, я не получаю вывод. Однако, если я закомментирую строки внутри rng_initialise
...
void rng_initialise__(int* s) {
// r = gsl_rng_alloc(gsl_rng_taus);
// gsl_rng_set(r, (unsigned long int)(*s));
}
затем я получаю вывод из кода Фортрана (он записывает 'call_rng_initialise' в STDOUT).
Итак, проблема, кажется, в вызовах gsl_rng_alloc и gsl_rng_set. Но я не получаю никаких сообщений об ошибках, и я не знаю, почему они мешают коду Фортрана делать что-либо. Есть идеи?