我编写了一个 Fortran 子例程来计算数组的大小,我想直接在 R 中获取结果。但是,我没有得到预期的结果...
首先我构建
size95.f95 file
subroutine fsize(x, n)
double precision, intent(in):: x(:)
integer, intent(out) :: n
n = size(x)
end subroutine fsize
然后我在 Windows 的 CMD 上编译它
R CMD SHLIB size95.f95
尽管在 R 中加载并测试 10 元素向量后,我得到的长度为 1 而不是 10。刚刚发生了什么??
x <- 1:10
dyn.load("size95.dll")
dotCall64::.C64("fsize",
SIGNATURE = c("double", "integer"),
INTENT = c("r", "w"),
x=x, n=dotCall64::integer_dc(1))
# $x
# NULL
#
# $n
# [1] 1
期望的输出应该是
# $x
# NULL
#
# $n
# [1] 10
非常感谢!
R 本身不理解 Fortran 假设的形状数组(例如
x
的 fsize
)。在 R 中使用假定的形状参数需要做很多工作,甚至 dotCall64
也无法为您做到这一点。
回想一下,Fortran 77 没有假定的形状数组。还记得在最近的 Fortran 中,当过程参数被假定为形状时,必须告知 Fortran 编译器(“显式接口”)。
必须告知 Fortran 编译器,因为假定的形状参数(通常)是使用 dope 向量实现的。1 也就是说,传递给过程的不是单独的数据(如
1:10
),而是数据和其他东西。
C 与 Fortran 的互操作性确实允许使用假定的形状数组,并且这是大量工作。您将能够使用 R 执行类似的操作。但是,要能够设置掺杂向量,您需要知道的事情之一是输入数组的大小:在这种情况下,大量工作没有回报。
目前,坚持使用标量或显式形状数组。
1 此答案中链接的是英特尔数组描述符的详细信息。 GCC 有类似。