ctypes 的输入和输出参数

发布于 2024-12-01 03:07:08 字数 360 浏览 1 评论 0原文

我在使用 python 中的 ctypes 格式化输入和输出参数以访问 dll 中的 fortran 函数时遇到问题。我可以访问库和函数,但在如何格式化参数方面遇到了困难。

f90 代码的开头是:

subroutine DataSub (Data_input,da,db,dy)

    double precision, intent(in) :: Data_input(9)
    double precision, intent(out) :: da,db,dy

How do you Define the input and output argument for this case in ctypes?

I am having a problem with formatting my input and output arguments using ctypes in python to access a fortran function in a dll. I can access the library and the function, but am struggling in how to format the arguments.

The f90 code starts as:

subroutine DataSub (Data_input,da,db,dy)

    double precision, intent(in) :: Data_input(9)
    double precision, intent(out) :: da,db,dy

How do you define the input and output arguments for this case in ctypes?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

神爱温柔 2024-12-08 03:07:08

像这样的东西:

from ctypes import *#just for brevity in this example
input = (c_double*9)()
input[0] = .....
da = c_double()
db = c_double()
dy = c_double()
dll.DataSub(byref(input), byref(da), byref(db), byref(dy))

Something like this:

from ctypes import *#just for brevity in this example
input = (c_double*9)()
input[0] = .....
da = c_double()
db = c_double()
dy = c_double()
dll.DataSub(byref(input), byref(da), byref(db), byref(dy))
美人如玉 2024-12-08 03:07:08

这些很可能是 c_double,但是您不应该再使用“双精度”。
使用带有 kind 属性的 real 代替,最好使用 Fortran 中的 ISO_C_Binding 来提供类似 C 的接口。
ISO_C_Binding 还允许您按值而不是按引用传递参数。
如果没有它,您将需要使用 http: //docs.python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

John Reid 提供了 ISO_C_Binding 的一些示例:http://www.fortran.bcs.org/2002/interop.htm

Most likely these would be c_double, however you shouldn't use "double precision" anymore.
Use real with a kind attribute instead, better yet use the ISO_C_Binding in Fortran to provide a C-like interface.
The ISO_C_Binding would also allow you to pass arguments by value instead of by reference.
Without it you will need to use http://docs.python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

Some samples for the ISO_C_Binding are provided by John Reid: http://www.fortran.bcs.org/2002/interop.htm

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文