Ошибка при вызове функции C DLL из Python - PullRequest
1 голос
/ 25 января 2020

Я пытаюсь выполнить свой код Python, который должен вызывать функцию C, которая выполняет некоторые вычисления и сохраняет значение в указателе, который должен быть доступен из кода Python. Я хотел бы сделать это, потому что я создаю DLL, и я хочу проверить алгебру внутри функции DLL, поэтому я хотел бы использовать код python для проверки DLL. Python Код

from ctypes import *


if __name__ == '__main__':

    mydll = cdll.LoadLibrary("./dll_simples.dll")
    funcao = mydll.simuser
    funcao.argtypes = c_double,c_double,POINTER(c_double),POINTER(c_double)



    a = 0
    b = 0
    input_1 = (c_double * 1)()
    input_1[0] = 5
    output_1  = (c_double * 1)()
    funcao(a,b,input_1,output_1)

и моя DLL

__declspec(dllexport) void simuser(double t, double delt, double* in, double* out)
{



out[0] = 2 * in[0];



}

после выполнения этого кода, у меня есть ошибка

funcao(a,b,input_1,output_1)

OSError: exception: access violation reading 0x0000000000000018

1 Ответ

0 голосов
/ 25 января 2020

Listing [Python 3.Docs]: ctypes - библиотека сторонних функций для Python.

Итак, вы хотите передать массив функции, которая ожидает указатель. Для этого случая требуется ctypes.cast :

Итак, вместо:

funcao(a, b, input_1, output_1)

используйте:

funcao(a, b, cast(input_1, POINTER(c_double)), cast(output_1, POINTER(c_double)))

Глядя на существующий код C, он использует только одно значение для 2 указателей, в случае, когда вам вообще не понадобятся массивы (но я сомневаюсь, что это намерение, потому что тогда входное значение не должно быть указатель):

# ...

input_1 = c_double(5)
output_1 = c_double(0)

funcao(a, b, byref(input_1), byref(output_1))

Рабочий пример: [SO]: указатель от Python (ctypes) до C для сохранения вывода функции (ответ @ CristiFati) .

...