r - 从 R 调用 Fortran:“有趣的逻辑数组”
问题描述
这是我在使用 R 和 Fortran 时遇到的一个有趣的问题。
考虑以下 Fortran 子例程:
! foo.f90
subroutine fun(n, x)
implicit none
integer, intent(in) :: n
logical, intent(in) :: x(n)
integer :: i
write(*,*) pack([(i, i=1, n)], x)
end subroutine fun
当用 R 编译R CMD SHLIB foo.f90
和调用时
dyn.load("foo.so")
x <- c(TRUE ,FALSE)
f <- .Fortran("fun", 2L, as.logical(x))
我收到错误消息:
Fortran runtime error: Funny sized logical array
当从 Fortran 程序调用相同的子程序时,
! test.f90
program test
implicit none
logical :: x(2)
x = [.true., .false.]
call fun(2, x)
contains
include "foo.f90"
end program test
没有错误发生:
$ gfortran foo.f90 test.f90 -o test
$ ./test
1
潜在罪魁祸首:我在这个例子中使用的 Fortran 编译器。我使用了 GNU Fortran 9.2.1。我注意到 gfortran 8.3.0 存在同样的问题,但早期版本 7.4.0、6.5.0 和 5.5.0 没有错误。但是为什么test.f90
具有相同子程序的 Fortran 程序会在这里工作呢?(即使使用相同的标志R CMD SHLIB
来编译foo.f90
和test.f90
: -fno-optimize-sibling-calls -fpic -ggdb -O0 -Wall -Wextra -pedantic -fimplicit-none -fcheck=all -fbacktrace
)。
刚开始这看起来很有趣,但在玩了一段时间后,这变得令人沮丧......
在此先感谢您的帮助。
更多细节:
> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.3 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.6.1
解决方案
推荐阅读
- c# - 如何从数据库 MSQL 中添加组合框值
- c++ - C++ 名称修饰 - 向后参考
- php - 我如何获得自定义帖子类型类别项目 Wordpress
- sql - 我如何 SQL 单独随机化每一列
- c# - Catch 块不在存储过程中执行
- python - 如何使 python 3 脚本从 Windows 10 上的 .bat 文件执行?
- r - 是否允许/可以在 Rcpp 中的 pragma openmp 并行 for 循环中调用 R 函数或 fortran 代码?
- c# - 自定义序列化父项和嵌套项
- excel - 当“N”放置在特定单元格内时,插入“N”个格式化行
- bash - 在 bash for 循环中使用 sed 时变量不扩展