Python Ctypes и C ++ указатели

C ++ функция:

DLLENTRY int VTS_API
SetParamValue( const char *paramName, void *paramValue ) //will return zero(0) in the case of an error
{
rtwCAPI_ModelMappingInfo* mmi = &(rtmGetDataMapInfo(PSA_StandAlone_M).mmi);
int idx = getParamIdx( paramName );
if (idx<0) {
return 0;                        //Error
}

int retval = capi_ModifyModelParameter( mmi, idx, paramValue );
if (retval == 1 ) {
ParamUpdateConst();
}

return retval;
}

и мой код Python:

import os
from ctypes import *

print(os.getcwd())
os.chdir(r"C:\MY_SECRET_DIR")
print(os.getcwd())

PSAdll=cdll.LoadLibrary(os.getcwd()+"\PSA_StandAlone_1.dll")

setParam=PSAdll.SetParamValue
setParam.restype=c_int

setParam.argtypes=[c_char_p, c_void_p]

z=setParam(b"LDOGenSpdSetpoint", int(20) )

возвращается

z=setParam(b"LDO_PSA_GenSpdSetpoint01", int(20) )
WindowsError: exception: access violation reading 0x00000020

Есть идеи, что может помочь?
Я уже пробовала POINTER а также byref(), но я получаю тот же вывод

0

Решение

SetParamValue ожидает указатель (недействительным * или же c_void_p) как 2й аргумент, но вы передаете ИНТ.
Функция будет интерпретировать его как указатель (адрес памяти), и при попытке разыменовать его (чтобы получить его содержимое) будет выдаёт ошибку сегментации (Нарушение доступа), поскольку у процесса нет разрешений на этот адрес.

Чтобы решить проблему, передайте соответствующие аргументы функции:

z = setParam(b"LDOGenSpdSetpoint", pointer(c_int(20)))

Вы можете найти более подробную информацию о [Python 3.5]: ctypes — библиотека сторонних функций для Python.

0

Другие решения

Других решений пока нет …

Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.