From Ancelet at engref.fr  Mon Feb  6 11:30:29 2006
From: Ancelet at engref.fr (Sophie Ancelet)
Date: Mon, 06 Feb 2006 11:30:29 +0100
Subject: [Rd] Troubles with the function rmultinom.c of the R's Random
 Number Generator
Message-ID: <3.0.6.32.20060206113029.007c2d70@Tilia.engref.fr>


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?

Thanks in advance,
Sophie. 



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.



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