<p>接受的答案是错误的,并导致分段错误,因为<code>float *</code>的内存从未分配。</p>
<p>“JAB”的答案指明了前进的方向,但我想详细说明一下。</p>
<p><strong>传递数组:</strong></p>
<p>问题是如何将python数组转换为c样式的数组。Python<code>array</code>(来自<a href="http://cython.readthedocs.io/en/latest/src/tutorial/array.html" rel="nofollow noreferrer">^{<cd2>} module</a>)是连续内存的包装器,因此不需要复制内存-我们只需将指针传递给c函数:</p>
<pre><code>from cpython cimport array
import array
def set_overlays(array.array verts):
setOverlays(verts.data.as_floats)
</code></pre>
<p>使用<code>array</code>模块比<code>numpy</code>更好,因为它是标准库的一部分-不需要安装任何东西。这个解决方案很短也很好,但是有一个问题:有人可以用<code>int-array</code>来使用它,并且不会出现错误-内存只是被重新解释了。有时这是一个人想要的,但大多数情况下不是这样。</p>
<p>为了确保传递的数组对象具有正确的数据类型,可以使用内存视图:</p>
<pre><code>from cpython cimport array #still needed
def set_overlays_memview(float[::1] verts):
setOverlays(&verts[0])
</code></pre>
<p><code>[::1]</code><a href="http://docs.cython.org/en/latest/src/userguide/memoryviews.html#c-and-fortran-contiguous-memoryviews" rel="nofollow noreferrer">ensures</a>,内存视图环绕连续内存。但是,如果内存视图中没有元素,这段代码就有问题,因为有越界访问<code>verts[0]</code>。正确的处理方法取决于函数<code>setOverlays</code>,而不是这个答案的一部分。</p>
<p><strong>传递列表:</strong></p>
<p>如果必须将python列表传递给c函数,则必须将值复制到连续内存中。最好使用<code>array</code>的功能-无需重新设计轮子:</p>
<pre><code>from cpython cimport array
import array
def set_overlays_list(list verts):
cdef array.array a = array.array('f', verts)
setOverlays(a.data.as_floats) #we already know they are floats
</code></pre>