1

我想在 R 中使用 fortran 程序,但在运行 R 程序时出现错误。fortran 代码具有二维的 REAL 变量。fortran 的测试代码如下所示:test_inside_program.f90:

program testprogram

implicit none
interface
    SUBROUTINE testm(testvar, thelength)
        IMPLICIT NONE
        REAL, INTENT(IN), DIMENSION(:) :: testvar
        INTEGER, INTENT(IN) :: thelength
    END SUBROUTINE testm
end interface

REAL, DIMENSION(:),ALLOCATABLE :: testvar
INTEGER :: i
allocate(testvar(3))
DO i = 1,2
  testvar(i) = i
ENDDO
call testm(testvar, 3)
write(*,*) 'program finished'
end program testprogram




SUBROUTINE testm(testvar,thelength)
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: thelength
    REAL, INTENT(IN), DIMENSION(:) :: testvar

    write(*,*) 'program cont. X'
    write(*,*)' THe testvar 1st variable is', testvar

END SUBROUTINE testm

我想从 R 调用子程序 testm。当然我想保持尺寸。因此我在 R 中生成了以下测试代码:test.r

dyn.load("test_inside_program.so")
is.loaded("testm")

dd <- c(5,2,3)
.Fortran("testm",as.single(dd),as.integer(3))

我会很感激你的帮助!我生成.so

R CMD SHLIB test_inside_program.f90
4

2 回答 2

1

你不能在这里声明一个假定的形状数组,因为 R 不知道如何传递这样一个数组(它不仅仅是一个指向数据的指针,它必须与维度一起出现)。

这将起作用:

subroutine testm(testvar,thelength)
   implicit none
   integer, intent(in) :: thelength
   real, intent(in), dimension(thelength) :: testvar

   write(*,*) 'program cont. x'
   write(*,*) 'length=', thelength
   write(*,*) 'testvar=', testvar
end subroutine testm

此外,根据您的需要,您可以考虑在程序中声明双精度数组并从 R 中“按原样”传递它们(这是默认的数字类型)。对于整数,您也可以直接在 R 中编写 3L,因此,对于单精度和双精度,它是这样的:

.Fortran("testm", as.single(dd), 3L)
.Fortran("testm", dd, 3L)
于 2013-09-13T07:52:20.253 回答
0

好的,问题解决了!fortran 中的子程序:

SUBROUTINE testm(testvar, thelength)
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: thelength
    REAL, INTENT(IN), DIMENSION(thelength) :: testvar
END SUBROUTINE testm

在 R 中

dd <- c(5.5,2,3.3)
#length(dd)
print("call fortran routine")
.Fortran("testm",as.single(dd),as.integer(3))

我不知道为什么它以前不起作用:o

于 2013-09-13T07:49:07.043 回答