<p>谢谢大家</p>
<p>下面是Python向Fortran传递多维数组的工作示例</p>
<p>python代码:</p>
<pre><code>from ctypes import *
import ctypes
import sys
import os
import numpy as np
sim = cdll.LoadLibrary(os.path.dirname(os.path.abspath(__file__)) + "/lib/struct.so")
class Param( Structure ):
pass
class Result( Structure ):
pass
def main():
x = 2
y = 3
z = 4
Param._fields_ = [( "len_x", c_int ),
( "len_y", c_int ),
( "len_z", c_int ),
( "c", POINTER(c_double)),
( "d", POINTER(c_double * x)),
( "e", POINTER(c_double * x * y))]
Result._fields_ = [( "len_x", c_int ),
( "len_y", c_int ),
( "len_z", c_int ),
( "f", POINTER(c_double)),
( "g", POINTER(c_double * x)),
( "h", POINTER(c_double * x * y))]
param = Param()
result = Result()
cc = (c_double * x)()
dd = ( (c_double * x) * y )()
ee = ( ( ( (c_double * x) * y ) * z ) )()
#[x]
cc[0] = 10.0
cc[1] = 20.0
#[y][x]
dd[0][0] = 10.0
dd[1][0] = 20.0
dd[2][0] = 30.0
dd[0][1] = 40.0
dd[1][1] = 50.0
dd[2][1] = 60.0
#[z][y][x]
ee[0][0][0] = 1.0
ee[1][0][0] = 2.0
ee[2][0][0] = 3.0
ee[0][1][0] = 4.0
ee[1][1][0] = 5.0
ee[2][1][0] = 6.0
param.len_x = x
param.len_y = y
param.len_z = z
param.c = cc
param.d = dd
param.e = ee
sim.structtest(byref(param), byref(result))
#[x]
print "1D"
print result.f[0]
print result.f[1]
#[y][x]
print "2D"
print result.g[0][0]
print result.g[1][0]
print result.g[2][0]
print result.g[0][1]
print result.g[1][1]
print result.g[2][1]
#[z][y][x]
print "3D"
print result.h[0][0][0]
print result.h[1][0][0]
print result.h[2][0][0]
print result.h[0][1][0]
print result.h[1][1][0]
print result.h[2][1][0]
if __name__ == "__main__":
result = main()
</code></pre>
<p>fortran代码:</p>
^{pr2}$
<p>输出:</p>
<pre><code> 1D
10.0000000000000
20.0000000000000
2D
10.0000000000000
20.0000000000000
30.0000000000000
40.0000000000000
50.0000000000000
60.0000000000000
3D
1.00000000000000
2.00000000000000
3.00000000000000
4.00000000000000
5.00000000000000
6.00000000000000
1D
10.0
20.0
2D
10.0
20.0
30.0
40.0
50.0
60.0
3D
1.0
2.0
3.0
4.0
5.0
6.0
</code></pre>