【问题标题】:Debug Fortran code from within R从 R 中调试 Fortran 代码
【发布时间】:2013-01-16 11:28:22
【问题描述】:

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

由于 Fortran 代码使用大量索引和数组维度存储为变量,我认为那里出了点问题。在某些时候,Fortran 代码正在内存中不应该出现的地方寻找。所以我需要单步执行 Fortran 代码并检查来自 R 的所有内容是否与我认为的一样,以及代码是否按照我的想法执行。

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

所以有谁知道我如何准确地检查 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

假设我想从 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)
}

【问题讨论】:

  • 非常琐碎的问题,但是为什么不将输入 Fortran 子例程的数量写入文件而不是屏幕?这样您就可以检查至少 R 和 Fortran 之间的通信是否正常工作。
  • @BálintAradi 我现在觉得自己很愚蠢...... ;-) 谢谢。
  • 嘿,最好的问题都有简单的答案:-)
  • 实际上,如果 R 在 Windows 命令行中运行,则可以看到 Fortran 屏幕输出(我假设您在 Windows 上,但它应该也可以在 Linux 命令行中运行)。

标签: r debugging fortran call subroutine


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多