gpt4 book ai didi

r - 从 R 中调试 Fortran 代码

转载 作者:行者123 更新时间:2023-12-04 20:14:07 25 4
gpt4 key购买 nike

我有一段很长的继承的 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)
}

最佳答案

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

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

关于r - 从 R 中调试 Fortran 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14357342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com