2011-08-22 94 views
0

我有一个问题,格式化我的输入和输出参数在python中使用ctypes访问dll中的fortran函数。我可以访问库和函数,但是在如何格式化参数方面挣扎。ctypes的输入和输出参数

的F90代码开始为:

subroutine DataSub (Data_input,da,db,dy) 

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

你是如何定义的输入和输出参数的这种情况下,ctypes的?

回答

2

事情是这样的:

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)) 
+0

如果其中一个输出是一个数组,它会是相似的吗?如果da(在FORTRAN中)长度为2,python中的调用是“da =(c_double * 2)()”? – Chris

+0

是的克里斯是正确的。阅读ctypes教程,它非常好。 –

+0

是的,谢谢。我一直在阅读它,但它在这样的一些领域中是模糊的或混乱的。感谢您的答复! – Chris

2

很可能这些会是c_double,但是不应该再使用“双精度”。 改为使用实型,而不是使用Fortran中的ISO_C_Binding来提供类似C的界面。 ISO_C_Binding还允许您通过值而不是通过引用传递参数。 没有它,你将需要使用http://docs.python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

为ISO_C_BINDING有些样品由约翰·里德提供:http://www.fortran.bcs.org/2002/interop.htm

+0

ctypes的可以参考就好过,确实需要这样做的输出参数 –

+0

其实,我认为没有ISO_C_Binding所有参数必须是byref,无论他们的意图。如果不使用绑定,您还需要知道编译器附加到符号的“_”。因此,在我看来,在Fortran方面引入一些接口定义是一个好主意。更紧密地模仿C语言行为应该可以实现更好的可移植性和Python方面的更少奇观。 – haraldkl