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
}
}
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
}
}
At 11:04 AM 4/8/2005, you wrote:>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. > >The Fortran subroutine beings with: > > integer tscore(maxexmn) /maxexmn*0/ > integer tstemp(maxexmn) /maxexmn*0/ > integer natscore(ncells) /ncells*0/ > integer natemp(ncells) /ncells*0/ >These are only reset to zero the first time when its loaded. Putting the reset manually in the Fortran code fixes it. Thanks to anyone who had been thinking about it! -Brian habing at stat.sc.edu