Re: [Rd] Troubles with the function rmultinom.c of the R's Random Number Generator

From: Hin-Tak Leung <hin-tak.leung_at_cimr.cam.ac.uk>
Date: Mon 06 Feb 2006 - 11:08:39 GMT

Sophie Ancelet wrote:

> Thank you for the answer. However, I sought in Doc. Writing R
> extensions, in particular in the paragraph 5.6 "Calling C from FORTRAN
> and vice versa" (page 67) but I did not find anything which could help me to
> correct my code. Indeed, rmultinom.c is a particular function
> since arrays are passed in arguments. Has somebody ever
> written a wrapper for this function?

You probably haven't managed to digest what Prof Ripley was writing: "All arguments to functions called from C by Fortran are pointers (or should be: yours are not)" - here is a more hand-holding kind of answer, which is exactly the same advice, really - you need to be doing something like this (note the pointers) instead:

 >>>void F77_SUB(sarmultinom)(int *n,
 >>>                         double** prob,
 >>>                         int *K,
 >>>                         int** rN){
 >>>rmultinom(n, prob, K, rN);}

I'll be interested to see what breaks - do you mind sending me both of test-multinom.f wrapper.c direct for me to have a look?

HTL

> At 17:06 20/01/06 +0000, Prof Brian Ripley wrote:
> 

>>All arguments to functions called from C by Fortran are pointers
>>(or should be: yours are not). The error is within your own code.
>>
>>You don't want to call rndstart and rndend around every call, only before
>>the first and after the last.
>>
>>This is not the list for advice om mixed Fortran/C programming, though.
> 
> 
> 
> 
> 

>>On Fri, 20 Jan 2006, Sophie Ancelet wrote:
>>
>>
>>>Hi,
>>>
>>>I'm simulating a Markov chain in Fortran interfaced with R-2.2.1 in order
>>>to generate data according to a Markov Random Field called the Potts model.
>>>
>>>R Version:
>>>platform i686-pc-linux-gnu
>>>arch i686
>>>os linux-gnu
>>>system i686, linux-gnu
>>>status
>>>major 2
>>>minor 2.1
>>>year 2005
>>>month 12
>>>day 20
>>>svn rev 36812
>>>
>>>
>>>
>>>
>>>Each loop of my Fortran calls the function rmultinom.c of the R's Random
>>>Number Generator through the wrapper:
>>>
>>>#include <R.h>
>>>#include <Rmath.h>
>>>void F77_SUB(sarmultinom)(int n,
>>> double* prob,
>>> int K,
>>> int* rN){
>>>rmultinom(n, prob, K, rN);}
>>>
>>>
>>>
>>>My fortran program is:
>>>
>>>subroutine testsarmultinom(n,prob,K,rN)
>>>implicit none
>>>integer n,K,rN(K)
>>>double precision prob(K)
>>>
>>>call rndstart()
>>>call sarmultinom(n,prob,K,rN)
>>>call rndend()
>>>end
>>>
>>>
>>>In order to understand better how the function rmultinom.c works, I have
>>>written an R code which calls this fortran subroutine as follows:
>>>
>>>system("R CMD SHLIB test-multinom.f wrapper.c")
>>>dyn.load("~/Package/test/test-multinom.so")
>>>
>>>n=1
>>>prob=c(0.6,0.1,0.3)
>>>K=3
>>>rN=c(1,0,0)
>>>res<- .Fortran("testsarmultinom",
>>> as.integer(n),
>>> as.double(prob),
>>> as.integer(K),
>>> as.integer(rN))
>>>
>>>
>>>Unfortunately, I have some trouble with the results. First, this command
>>>always returns 0 values. In other words, I always get:
>>>
>>>
>>>>res[[4]]
>>>
>>>[1] 0 0 0
>>>
>>>
>>>Moreover, if I run this R code a second time, an error message appears:
>>>Segmentation fault.
>>>
>>>Has somebody ever used rmultinom.c and encountered these problems? My code
>>>must be wrong but I don't know where. In this case, what is the correct way
>>>to call the C function rmultinom.c?
>>>
>>>Thanks in advance,
>>>
>>>Sophie.
> 
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Mon Feb 06 22:33:55 2006

This archive was generated by hypermail 2.1.8 : Tue 07 Feb 2006 - 01:51:58 GMT