从R中调试Fortran代码

Jor*_*eys 5 debugging fortran r call subroutine

我有一段很长的继承的FORTRAN77代码,我从R调用它.Fortran().Fortran代码包含一组子例程,当嵌入到Fortran程序中并随后从命令行编译和运行时可以工作.但是,当我从R调用它时,它第二次调用该函数时会崩溃R.

由于Fortran代码使用大量索引和数组维度存储为变量,因此我认为存在问题.在某些时候,Fortran代码正在寻找内存中不应该存在的位置.因此,我需要逐步检查Fortran代码,检查是否所有来自R的内容都是我认为的,并且代码执行我认为它的功能.

如果它是一个R函数,我可以选择使用debug(),添加browser()语句并打印出我希望在代码中的某个点看到的任何值.但Fortran代码不允许任何这些事情发生.如果我理解正确,Fortran的屏幕输出不会被R捕获.

所以有人知道我究竟能检查R传递给Fortran代码的参数的类型和值.如果你可以解释一下我从R调用后如何调试该代码,那将是非常出色的.

这是一个例子来说明我的意思.

C An example program
C
      PROGRAM EXAMPLE
      INTEGER N
      PARAMETER (N=10)
      REAL X0, X(N),MEAN

C
      X0 = 14
      DO 10 I = 1,10
         FI = FLOAT(I)
         X(I) = X0 + FI
   10 CONTINUE
      CALL MYSUB(X0,MEAN)
      END
C
C Mysub the subroutine
C
      SUBROUTINE MYSUB(X,N,MEAN)
      INTEGER N
      REAL X(N), MEAN
      MEAN = 0
      DO 20 I = 1,N
         MEAN = MEAN + X(I)
   20 CONTINUE
      MEAN = MEAN / N
      RETURN
      END
Run Code Online (Sandbox Code Playgroud)

假设我想从R调用子程序mysub,我想确保正确地得到X和N. 我使用以下功能:

mysub <- function(x){
    if(!is.vector(x) | is.numeric(x)) stop("X has to be a numeric vector")
    n <- length(x)
    res <- .Fortran('mysub',X=as.single(x), N=as.integer(n), MEAN=single(1))
    return(res$MEAN)
}
Run Code Online (Sandbox Code Playgroud)

小智 4

在您的示例程序中,您仅使用 2 个参数调用 MYSUB,而不是 MYSUB 定义中的 3 个参数:(X, N, MEAN)

这可能与你的问题无关,但既然你问的是调试 FORTRAN 和参数,我想我应该指出这一点。FORTRAN子程序是独立编译的。没有什么可以阻止您传递错误数量的参数(没有编译器错误或链接提示),这可能会导致问题。