Мне кажется, что проблема заключается в неправильном понимании того, как многомерные массивы работают в C. Выражение типа a[r][c]
может означать одно из двух в зависимости от типа a
. Если бы тип a
был float **
, то выражение означало бы двойную разыменовку со смещением указателя, что-то вроде этого, если сделать длинную руку:
float *row = a[r]; // First dereference yields a pointer to the row array
return row[c] // Second dereference yields the value
Если тип a
был взамен float (*)[ncols]
, то выражение становится просто сокращением для формирования непрерывной одномерной области памяти в виде многомерного массива:
float *flat = (float *)a;
return flat[(r * ncols) + c]; // Same as a[r][c]
Таким образом, в вашем коде C тип аргумента pytrain()
должен быть либо float *
, либо float (*)[ncols]
, и ваш код Python должен выглядеть примерно так (если вы используете NumPy для данных массива) :
c_float_p = ctypes.POINTER(ctypes.c_float)
autofoo.pytrain.argtypes = [c_float_p]
data = numpy.array([[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]], dtype=numpy.float32)
data_p = data.ctypes.data_as(c_float_p)
autofoo.pytrain(data_p)
И если вы действительно используете NumPy, загляните на страницу ctypes вики SciPy .