我在Fortran 90中有以下子程序:
subroutine foo(bar)
use spam ! dimension n is defined in the module spam
implicit none
real*8 bar(n)
....
end subroutine foo
由于数组维n
是在模块spam
中定义的,因此我在编译C包装函数(由f2py
生成)时遇到错误,例如
error: ‘n’ undeclared (first use in this function)
因为C包装函数没有对spam
或n
的任何引用。
这应该是什么解决方案?
我目前正在为巨大的Fortran程序做准备,这是一个我没有写过的程序。我现在认为在公共块/模块中传递有关参数的信息是不好的做法,因为它可能导致这样的问题。
是否有任何解决方法,或者我是否必须重构整个代码以将数组维度添加为参数?
此外,没有机会修改C源,因为它是由f2py
自动生成的。
答案 0 :(得分:1)
mod.f90
module m
integer :: n = 1
end module
main.f90时
subroutine s
use m
real :: a(n)
print *,n
end subroutine
蟒:
f2py -c -m main mod.f90 main.f90
ipython
In [1]: import main
In [2]: main.s()
1
In [3]: main.m.n=5
In [4]: main.s()
5
我在使用模块变量时没有遇到任何问题。
<强> --- ---编辑强>
当大小取决于模块变量(不是命名常量)时,我可以用显式大小数组伪参数确认问题,即:
subroutine s(a)
use m, only: n
real :: a(n)
end subroutine
避免显式边界的一种方法是使用假定的形状数组(a(:)
)。假定的大小数组需要显式接口,因此它们必须放在调用代码使用的模块中,或者必须提供接口块。模块通常是首选。