Вот смешная проблема, с которой я сталкиваюсь с 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 CMD SHLIB foo.f90
ивызывается в R с
dyn.load("foo.so")
x <- c(TRUE ,FALSE)
f <- .Fortran("fun", 2L, as.logical(x))
Я получаю сообщение об ошибке:
Fortran runtime error: Funny sized logical array
Когда та же подпрограмма вызывается из программы на Фортране,
! 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
Потенциальный преступник: Компилятор Фортрана, который я использую для этого примера. Я использовал GNU Fortran 9.2.1. Я заметил ту же проблему с gfortran 8.3.0, но ошибок с более ранними версиями 7.4.0, 6.5.0 и 5.5.0 не было. Но почему программа на Фортране test.f90
с такой же подпрограммой работает здесь? (даже когда те же флаги, которые используются 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