如何直接从 Fortran 到 R 获取数组大小?

问题描述 投票:0回答:1

我编写了一个 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
1个回答
0
投票

R 本身不理解 Fortran 假设的形状数组(例如

x
fsize
)。在 R 中使用假定的形状参数需要做很多工作,甚至
dotCall64
也无法为您做到这一点。

回想一下,Fortran 77 没有假定的形状数组。还记得在最近的 Fortran 中,当过程参数被假定为形状时,必须告知 Fortran 编译器(“显式接口”)。

必须告知 Fortran 编译器,因为假定的形状参数(通常)是使用 dope 向量实现的。1 也就是说,传递给过程的不是单独的数据(如

1:10
),而是数据和其他东西。

C 与 Fortran 的互操作性确实允许使用假定的形状数组,并且这是大量工作。您将能够使用 R 执行类似的操作。但是,要能够设置掺杂向量,您需要知道的事情之一是输入数组的大小:在这种情况下,大量工作没有回报。

目前,坚持使用标量或显式形状数组。


1 此答案中链接的是英特尔数组描述符的详细信息。 GCC 有类似

© www.soinside.com 2019 - 2024. All rights reserved.