我有一个Fortran子程序,它根据字符串的值选择一个函数,然后执行该函数。
!! file:select.f90
module funcs
contains
subroutine add(x, y, xy)
real :: x, y, xy
xy = x + y
return
end subroutine
subroutine diff(x, y, xy)
real :: x, y, xy
xy = x - y
return
end subroutine
end module
subroutine simple(modname)
use funcs
procedure(), pointer :: model => null()
character(10) :: modname
real :: x, y, xy
print *, "-",modname,"-"
select case (modname)
case("add")
model => add
case("diff")
model => diff
case default
print *, "No model with that name!"
stop
end select
x = 4
y = 3
call model(x, y, xy)
print *, xy
end subroutine
我想从R脚本中调用这个子程序。
# file:select.R
dyn.load("select.so")
.Fortran("simple", "add")
.Fortran("simple", "diff")
作为一个独立的Fortran
程序
,它可以很好地运行,并且对于modname
前后的空格不敏感。但是,当我尝试从R中传入字符作为参数时,它会正确地重新打印字符(没有任何额外的空格),但随后无法将其识别为case
并跳转到default
。这是怎么回事?R字符是否存在某种编码问题,使其与Fortran不兼容?
select case (adjustl(trim(modname)))
。 - Alexey Shiklomanov