[R] DLL Memory Problem
Brian Habing
habing at stat.sc.edu
Fri Apr 8 17:01:55 CEST 2005
Hello,
I have created a .dll file using G77 and MinGW on my PC (Windows
2000). After using dyn.load to bring it into R2.0.1, I then call the .dll
through the function ccprox shown below. It returns the correct
values. If I run it a second time though it returns different values, so
it seems something is being placed oddly in memory.
If I unload and reload the .dll it works again the first time.
It does the same if I copy the compiled .dll over to my Windows XP machine.
Thank you for any help,
Brian Habing
habing at stat.sc.edu
The Fortran subroutine beings with:
subroutine ccprox(nexmn,nitem,respmat2,covmatr,covmatt,
$ cormatr,cormatt)
!ccccc This subroutine will calculate all the pairwise
!ccccc conditional covariances. An ending r means for
!ccccc rest score, an ending t means for total score.
parameter (maxitem=100,maxexmn=10000,maxcats=10,ncells=1001)
!ccccc ncells must be maxitem*maxcats+1
integer nexmn,nitem,scoretemp,mscore
integer respmat(maxexmn,maxitem)
integer tscore(maxexmn) /maxexmn*0/
integer tstemp(maxexmn) /maxexmn*0/
integer natscore(ncells) /ncells*0/
integer natemp(ncells) /ncells*0/
integer i,j,k,l
integer tcountt,tcountr,tcountt2,tcountr2
real*8 respmat2(maxexmn,maxitem)
real*8 pisum(ncells),plsum(ncells),pilsum(ncells)
real*8 qisum(ncells),qlsum(ncells),qilsum(ncells)
real*8 pi2sum(ncells),pl2sum(ncells)
real*8 qi2sum(ncells),ql2sum(ncells)
real*8 covmatr(maxitem,maxitem),cormatr(maxitem,maxitem)
real*8 covmatt(maxitem,maxitem),cormatt(maxitem,maxitem)
real*8 sisl
The R function that is calling it is as follows (inputdata is a 400x10
matrix of 0's and 1's
in the example I have been trying).
ccprox<-function(inputdata){
nexmn<-length(inputdata[,1])
nitem<-length(inputdata[1,])
covmatr<-matrix(0,100,100)
covmatt<-matrix(0,100,100)
cormatr<-matrix(0,100,100)
cormatt<-matrix(0,100,100)
respmat2<-matrix(0,nrow=10000,ncol=100)
respmat2[1:nexmn,1:nitem]<-as.matrix(inputdata)
if (is.loaded("ccprox_")==TRUE){
x<-(.C("ccprox_",as.integer(nexmn),as.integer(nitem),respmat2,
covmatr,covmatt,cormatr,cormatt))
list(covmatr=x[[4]][1:nitem,1:nitem],covmatt=x[[5]][1:nitem,1:nitem],
cormatr=x[[6]][1:nitem,1:nitem],cormatt=x[[7]][1:nitem,1:nitem],)
}
else{
warning("ccprox.dll was not loaded")
NULL
}
}
More information about the R-help
mailing list