<p>在C中,<code>float**</code>指向<code>float*</code>指针的表/数组中的第一个元素。在</p>
<p>假设这些<code>float*</code>中的每一个都指向<code>float</code>值的表/数组中的第一个元素。在</p>
<p>您的函数声明有1个计数,但不清楚此计数适用于什么:</p>
<pre><code>void compute (int count, float** input, float** output)
</code></pre>
<ul>
<li>二维矩阵<code>count</code>x<code>count</code>大小?在</li>
<li><code>count</code>-大小为<code>float*</code>的数组,每个数组都以某种方式终止,例如用<code>nan</code>?在</li>
<li>以空结尾的数组<code>float*</code>每个<code>count</code>元素(合理假设)?在</li>
</ul>
<p>请澄清您的问题,我将澄清我的答案:-)</p>
<p>假设最后一个API解释,下面是我的计算函数示例:</p>
^{pr2}$
<p>示例计算函数的测试代码:</p>
<pre><code>#include <stdio.h>
extern void compute(int count, float** in, float** out);
int main(int argc, char** argv)
{
#define COUNT 3
float ina[COUNT] = { 1.5, 0.5, 3.0 };
float inb[COUNT] = { 0.1, -0.2, -10.0 };
float outa[COUNT];
float outb[COUNT];
float* in[] = {ina, inb, (float*)0};
float* out[] = {outa, outb, (float*)0};
compute(COUNT, in, out);
for (int row=0; row<2; row++)
for (int c=0; c<COUNT; c++)
printf("%d %d %f %f\n", row, c, in[row][c], out[row][c]);
return 0;
}
</code></pre>
<p>以及如何通过Python中的ctypes为<code>count</code>==10<code>float</code>子数组和大小<code>2</code><code>float*</code>数组使用相同的方法,其中包含1个实子数组和NULL终止符:</p>
<pre><code>import ctypes
innertype = ctypes.ARRAY(ctypes.c_float, 10)
outertype = ctypes.ARRAY(ctypes.POINTER(ctypes.c_float), 2)
in1 = innertype(*range(10))
in_ = outertype(in1, None)
out1 = innertype(*range(10))
out = outertype(out1, None)
ctypes.CDLL("./compute.so").compute(10, in_, out)
for i in range(10): print in_[0][i], out[0][i]
</code></pre>
<p>这里介绍ctypes的Numpy接口<a href="http://www.scipy.org/Cookbook/Ctypes#head-4ee0c35d45f89ef959a7d77b94c1c973101a562f" rel="nofollow">http://www.scipy.org/Cookbook/Ctypes#head-4ee0c35d45f89ef959a7d77b94c1c973101a562f</a>,arr.ctypes.shape形状[:] 前进的步伐[:]和arr.ctypes.data公司是您所需要的;您可以将其直接提供给您的<code>compute</code>。在</p>
<p>下面是一个例子:</p>
<pre><code>In [55]: a = numpy.array([[0.0]*10]*2, dtype=numpy.float32)
In [56]: ctypes.cast(a.ctypes.data, ctypes.POINTER(ctypes.c_float))[0]
Out[56]: 0.0
In [57]: ctypes.cast(a.ctypes.data, ctypes.POINTER(ctypes.c_float))[0] = 1234
In [58]: a
Out[58]:
array([[ 1234., 0., 0., 0., 0., 0., 0., 0.,
0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0.]], dtype=float32)
</code></pre>