Массив Numpy в массив Ctypes: ошибка нарушения прав доступа - PullRequest
0 голосов
/ 04 июня 2018

Оборачивая C ++ DLL в Python, используя ctypes, я пытаюсь передать двумерные np.array целых чисел в обернутую функцию в DLL, которая представляет собой массив значений типа double в C ++.

Код ниже:

# create numpy array of int
np_array = np.array([[1503, 0.15],
                     [1504, 0.14],
                     [1505, 0.13],
                     [1506, 0.12]])

# C++ function in DLL wrapped in Python
def fn(double, np_array):

    # import DLL
    my_dll = CDLL('my_dll.dll')

    # create pointer: array of double pointer based on m by n numpy array
    array_of_double_pointer = POINTER(c_double * np_array.shape[1] * np_array.shape[0])

    # convert np.array to ctypes array object:
    c_np_array = np.ctypeslib.as_ctypes(np_array)

    # set argument and return types
    my_dll.fn.argtypes = [c_double, array_of_double_pointer]
    my_dll.fn.restype = c_double

    result = my_dll.fn(double, c_np_array)
    return result

Что выдает ошибку:

OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF

Когда print(array_of_double_pointer):

<class '__main__.LP_c_double_Array_2_Array_4'> 

Когда print(c_np_array):

<__main__.c_double_Array_2_Array_4 object at 0x00000000037B8DC8>

Я также попробовал следующее решение, с которым я столкнулся на SO, для преобразования массива np.array' to ctypes и создания указателя массива ctypes:

c_array= np.ascontiguousarray(np_array, dtype=int)
array_of_double_pointer = c_array.ctypes.data_as(POINTER(c_double))

, котороебросает TypeError:

TypeError: item 2 in _argtypes_ has no from_param method
...