我有一个类似的fortran链表
type :: node
type(node), pointer :: next => null()
integer :: value
end type node
理想情况下,我希望使用Cpython与此进行交互 . 我使用f2py程序创建了共享对象,使用了很多python的子程序 . 但是,f2py不能与派生类型一起使用 .
我的问题是,是否有可能使用cpython访问Fortran中的链接列表 . 我认为我需要遵循fortran来c到cpython路线 . 但是,我已经读过,因为fortran派生类型可以与c _2875146进行互操作 . 同样,帖子c-fortran interoperability - derived types with pointers似乎证实了这一点 .
我想知道是否有人知道是否绝对无法从cpython访问fortran中的链表 . 如果有可能,即使是间接或以一种全面的方式,我将不胜感激 .
谢谢你,马克
1 回答
正如BálintAradi在评论中已经提到的那样,节点不能与C的当前形式互操作 . 为此你需要将fortran指针改为C指针,但这使得在fortran中使用它非常痛苦 . 我能想到的最优雅的解决方案是将C互操作类型置于fortran类型中并保存C和fortran指针的单独版本 .
实现如下所示,我还定义了在fortran中使用的便捷函数来分配,释放和初始化节点 .
正如您所看到的,访问“value”元素需要额外的“%c”,这有点令人讨厌 . 要使用python中先前定义的例程来检索链表,必须定义C互操作包装器并且必须链接C指针 .
“* _nodes_citer”例程简单地处理不同的指针类型,而set_cptr子例程根据fortran指针链接C可互操作类型内的C指针 . 我添加了节点%c%self元素,以便可以恢复fortran指针并用于正确的释放,但是如果你不太关心它,那么它不是严格需要的 .
此代码需要编译为共享库以供其他程序使用 . 我在我的linux机箱上使用了以下命令和gfortran .
最后,python代码分配10个节点的列表,打印出每个节点的节点%c%值,然后再次释放所有内容 . 另外,还示出了fortran和C节点的存储器位置 .
执行此操作会给我以下输出:
有趣的是,两个节点类型都从相同的内存位置开始,因此并不真正需要节点%c%self,但这只是因为我对类型定义非常谨慎,这真的不应该被依赖 .
你有它 . 即使不必处理链表也很麻烦,但是ctypes比f2py强大得多 . 希望从中得到一些好处 .