首页 > 解决方案 > 从 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.f90test.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

标签: rfortrangfortran

解决方案


推荐阅读