我有一个两部分的问题,可能会改变首选习惯,以及我是否会不必要地使问题复杂化。我一直在使用.C并且学会了。呼叫来自R的重担。我想与.Fortran进行比较,所以我一直在学习它。因此,我的问题可能是由于我有限的Fortran知识。
在R中实现了几个我希望转换为Fortran的函数,它们彼此相关。我没有弄清问题的细节,而是创造了一个不切实际的例子,但这是一个很好的例子。
我有两个函数和两个相关的子程序来查找幅度和平方幅度,它们构成了整个文件:
! Actual functions
real function sumofsquaresfun (x,y)
implicit none
real :: x,y
sumofsquaresfun=x*x+y*y
end function sumofsquaresfun
real function magnitudefun(x,y)
implicit none
real :: x,y,tmp
tmp=sumofsquaresfun(x,y)
magnitudefun=sqrt(tmp)
end function magnitudefun
! Wrappers for R accessibility since R requires subroutines
subroutine sumofsquares(x,y,answer)
implicit none
real :: x,y
real answer
answer=sumofsquaresfun(x,y)
end subroutine sumofsquares
subroutine magnitude(x,y,answer)
implicit none
real :: x,y
real answer
answer=magnitudefun(x,y)
end subroutine magnitude
假设当我在R中时两个子程序都很有用,所以将两者分开是很重要的。
当我尝试使用
进行编译时R CMD SHLIB fortrancode.f95
我有几个错误有两种类型的错误:
Error: Return type mismatch of function 'sumofsquaresfun' at (1) (UNKNOWN/REAL(4))
Error: Function 'sumofsquaresfun' at (1) has no IMPLICIT type
等
我的问题按重要性顺序排列:
非常感谢!
答案 0 :(得分:1)
这更像是Fortran问题,而不是R问题。 您尚未在子例程中声明函数。 这样做,它应该编译。
! Actual functions
real function sumofsquaresfun (x,y)
implicit none
real :: x,y
sumofsquaresfun=x*x+y*y
end function sumofsquaresfun
real function magnitudefun(x,y)
implicit none
real :: x,y,tmp
real sumofsquaresfun
tmp=sumofsquaresfun(x,y)
magnitudefun=sqrt(tmp)
end function magnitudefun
! Wrappers for R accessibility since R requires subroutines
subroutine sumofsquares(x,y,answer)
implicit none
real :: x,y
real answer
real sumofsquaresfun
answer=sumofsquaresfun(x,y)
end subroutine sumofsquares
subroutine magnitude(x,y,answer)
implicit none
real :: x,y
real answer
real magnitudefun
answer=magnitudefun(x,y)
end subroutine magnitude
警告:您正在使用real
,但不要忘记R使用双精度。 real
是单精度。您应该使用real*8
或Fortran95
等效的内容。