我有一个子程序,它计算一个大型数组并将其写入文件。我正在尝试将其转换为返回该数组的函数。但是,我得到一个非常奇怪的错误,这似乎与我返回一个数组的事实有关。当我尝试返回一个浮动(作为测试)时,它完全正常。
这是MWE,我用py [HttpPost]
public void Post([FromBody]String test) {
}
调用它:
mwe('dir', 'postpfile', 150, 90.)
这很好用,并按预期打印:
FUNCTION mwe(dir, postpfile, nz, z_scale)
IMPLICIT NONE
INTEGER :: nz
REAL(KIND=8) :: z_scale
CHARACTER(len=100) :: postpfile
CHARACTER(len=100) :: dir
REAL(kind=8) :: mwe
print*,'dir ', dir
print*,'postpfile ', postpfile
print*,'nz ', nz
print*,'Lz ', z_scale
mwe = 4.5d0
END FUNCTION mwe
但是,如果我将函数定义为数组:
dir dir
postpfile postpfile
nz 150
Lz 90.000000000000000
然后打印出来:
FUNCTION mwe(dir, postpfile, nz, z_scale)
IMPLICIT NONE
INTEGER :: nz
REAL(KIND=8) :: z_scale
CHARACTER(len=100) :: postpfile
CHARACTER(len=100) :: dir
REAL(KIND=8),DIMENSION (2,23) :: mwe
print*,'dir ', dir
print*,'postpfile ', postpfile
print*,'nz ', nz
print*,'Lz ', z_scale
mwe = 4.5d0
END FUNCTION mwe
我正在运行f2py版本2,NumPy 1.11.1和Python 3.5.1。
修改
我正在使用 dir postpfile
postpfile ��:����������k�� 2����V@(����H���;�!��v
nz 0
Segmentation fault (core dumped)
进行编译,并使用f2py -c -m fmwe fmwe.f90
调用该函数。
答案 0 :(得分:1)
我认为问题来自缺乏显式接口的某个地方。 (不确定可能是其他人可以更准确地指出问题是什么。)
尽管我不确定我的解释,但我有2个工作案例。 将您的功能更改为子程序或将您的功能放入模块(它自己生成显式接口)解决了您提到的问题。
下面的脚本仍然可以像python中的my_sub('dir', 'postpfile', 150, 90.)
一样调用。
subroutine my_sub(mwe, dir, postpfile, nz, z_scale)
implicit none
integer,intent(in) :: nz
real(KIND=8),intent(in) :: z_scale
chracter(len=100),intent(in) :: postpfile
character(len=100), intent(in) :: dir
real(KIND=8), intent(out) :: mwe(2,23)
print*,'dir ', dir
print*,'postpfile ', postpfile
print*,'nz ', nz
print*,'Lz ', z_scale
mwe = 4.5d0
end subroutine my_sub
如果在模块中使用该函数,则需要以不同的方式从python进行调用; test('dir', 'postpfile', 150, 90.)
。
module test
contains
function mwe(dir, postpfile, nz, z_scale)
implicit none
integer :: nz
real(KIND=8) :: z_scale
chracter :: postpfile
character(len=100) :: dir
real(KIND=8) :: mwe(2,23)
print*,'dir ', dir
print*,'postpfile ', postpfile
print*,'nz ', nz
print*,'Lz ', z_scale
mwe = 4.5d0
end function mwe
end module test
我没有尝试,但它可能适用于适当的Fortran interface
,包括你的函数。(假设存在显式接口是关键)
我希望有人能完成/纠正我的答案。