4

我在 Fortran 中得到了这个简单的模块:

测试.f90

module test
   implicit none
contains

   subroutine foo(chid)
      implicit none
      character(len=*),intent(out):: chid          ! char. identifier
      chid = "foo"
   end subroutine foo
end module test

program bar
   use test
   character(len=20) text
   call foo(text)
   write(*,*) text
end program bar

编译它(在 Windows 上)gfortran test.f90 -o test.exe并运行它,正如预期的那样:

 foo

我也可以使用 f2py 编译它:c:\Python27\python.exe c:\Python27\Scripts\f2py.py --fcompiler=gnu95 --compiler=mingw32 -c -m test \test.f90

当我运行这个 Python 脚本时:

测试.py

from id_map import test

print "This should be 'foo':"
print test.foo()
print "was it?"

我得到以下输出:

This should be 'foo':

was it?

如您所见,应为“foo”的字符串为空。为什么是这样?

4

1 回答 1

5

这里的问题len=*在于字符声明。您是在告诉 fortran 编译器接受输入的任何长度的字符串。这很好,除非你用f2pyintent包装它out,f2py 需要猜测要分配的长度字符串并传递给你的函数,它没有办法这样做。(毕竟,它应该假设什么长度的字符串?)。

在我看来, f2py 假设一个长度为 0 的字符串。当您在 fortran 中将较大的字符串分配给较小的字符串时,结果会被截断(尽管我需要返回并阅读标准以了解这是否会导致内存错误)。无论如何,看起来这就是 gnu 编译器正在做的事情。

如果您将其更改为len=3,则它可以工作。

或者,做这样的事情可以在不修改原始代码的情况下使 f2py 工作(除了一些注释):

      !f2py character(len=256),intent(out):: chid
      character(len=*),intent(out):: chid          ! char. identifier
于 2013-06-27T14:35:18.677 回答