The ctypes
attribute of ndarray can interact with the ctypes module, for example, ndarray.ctypes.data
is the data address of the array, you can cast it to a float *
pointer,
and then pass the pointer to the C function.
import numpy as np
from cffi import FFI
ffi = FFI()
ffi.cdef("void copy(float *in, float *out, int len);")
C = ffi.dlopen("ccode.dll")
a = 42*np.ones(16, dtype=np.float32)
b = np.zeros_like(a)
pa = ffi.cast("float *", a.ctypes.data)
pb = ffi.cast("float *", b.ctypes.data)
C.copy(pa, pb, len(a))
print b
For your question 3:
I think ffi array doesn't provide numpy the necessary information to access it's inner buffer. So numpy try to convert it to a float number which failed.
The best solution I can thinks is convert it to list first:
float_in[0:16] = list(arr_in[0:16])