Sorry, my example was just to give you a rough idea of how to do this. Here is an example that works.
myrandom.c: #include <R.h> #include <Rmath.h> void F77_SUB(fseedi)(void) { GetRNGstate(); } void F77_SUB(fseedo)(void) { PutRNGstate(); } void F77_SUB(myrbeta)(double* px, double* pa, double* pb) { *px = rbeta(*pa, *pb); } and example.f subroutine example(x, a, b) implicit double precision (a-h,o-z) call fseedi() call myrbeta(x, a, b) call fseedo() end Note: it is important that there are 6 spaces at the beginning of each line. Also, don't do this: void F77_SUB(myrbeta)(double* px) { GetRNGstate(); *px = rbeta(1.00,3.00); PutRNGstate(); } It spends more time seeding the random number generator than generating random numbers. Regards, Kjell On Feb 14, 2009, at 11:09 AM, Fabio Mathias wrote: > As I am wanting to generate a beta, then I created a function in C > to generate a beta, but the problem appears when I go to compile > > My function in C is > > #include <R.h> > #include <Rmath.h> > #include <math.h> > > void F77_SUB(myrbeta)(double* px) > { > GetRNGstate(); > *px = rbeta(1.00,3.00); > PutRNGstate(); > } > > My function in Fortran is > > subroutine blah(a) > double precision (a) > call myrbeta(RND) > end > > The error > > fmc...@fmcron-desktop:~/teste$ R CMD SHLIB mat.c blah.f > gcc -std=gnu99 -I/usr/share/R/include -fpic -g -O2 -c mat.c - > o mat.o > gfortran -fpic -g -O2 -c blah.f -o blah.o > blah.f:1.1: > > subroutine blah(a) > 1 > Erro: Non-numeric character in statement label at (1) > blah.f:1.1: > > subroutine blah(a) > 1 > Erro: Unclassifiable statement at (1) > blah.f:2.1: > > double precision (a) > 1 > Erro: Non-numeric character in statement label at (1) > blah.f:2.1: > > double precision (a) > 1 > Erro: Unclassifiable statement at (1) > blah.f:4.1: > > end > 1 > Erro: Non-numeric character in statement label at (1) > blah.f:4.1: > > end > 1 > Erro: Unclassifiable statement at (1) > make: ** [blah.o] Erro 1 > > > Fábio Mathias Corrêa > UFLA > > > --- Em sex, 13/2/09, Kjell Konis <kjell.ko...@epfl.ch> escreveu: > De: Kjell Konis <kjell.ko...@epfl.ch> > Assunto: Re: [Rd] Generate random numbers in Fortran > Para: "fabio.u...@yahoo.com.br" <fabio.u...@yahoo.com.br> > Cc: "r-devel@r-project.org" <r-devel@r-project.org> > Data: Sexta-feira, 13 de Fevereiro de 2009, 16:49 > > Take a look at section 6.6 in Writing R Extensions. It describes > how to call C > functions from FORTRAN. > > Basically it just boils down to this, in a C file define > the functions > > void F77_SUB(fseedi)(void) > { > int x = 100; > seed_in(&x); > } > > > void F77_SUB(fseedo)(void) > { > int x = 100; > seed_out(&x); > } > > > void F77_SUB(myrunif)(double* px) > { > *px = unif_rand(); > } > > > Then you could write a FORTRAN subroutine like > > subroutine blah() > implicit double precision (a-h,o-z) > call fseedi() > call myrunif(RND) > call fseedo() > end > > The fseed* subroutines only need to be called once, fseedi at the > beginning of > your FORTRAN code and fseedo at the end. > > HTH, > Kjell > > > On 13 févr. 09, at 17:32, Fabio Mathias wrote: > > > Hi!!! > > It would like to know if it exists a form to use the functions to > > generate variates in FORTRAN with the same easiness I use that > them in > > C? Or not? > > If yes. They > > would have some example? I would like to use the functions > rbeta, rlnorm and others! > > > > > > Sorry my english..rsrsrs > > > > Thanks!!! > > > > > > Fábio Mathias Corrêa University Federal of the > Lavras - > Brazil > > > > > > > > Veja quais são os assuntos do momento no Yahoo! +Buscados > > > > [[alternative HTML version deleted]] > > > > <ATT00001.txt> > > > Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 > - Celebridades - Música - Esportes [[alternative HTML version deleted]]
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel