2014-08-29 6 views
0

Теперь мой код работает с обычной библиотекой c, но мне нужно использовать .so-библиотеку из Caen, и я получаю ошибку сегментации. Это код:C .so library Python

from ctypes import * 
lib = CDLL('./libcaenhvwrapper.so.5.56') 
lib.CAENHVInitSystem.restype = c_int 
lib.CAENHVInitSystem.argtypes = [c_int, c_int, c_char_p, c_char_p, c_char_p] 
lib.CAENHVGetError.restype = c_int  

CAENHV_SYSTEM_TYPE_t = c_int 
sy1527 = CAENHV_SYSTEM_TYPE_t(0) 
sy2527 = CAENHV_SYSTEM_TYPE_t(1) 
sy4527 = CAENHV_SYSTEM_TYPE_t(2) 
sy5527 = CAENHV_SYSTEM_TYPE_t(3) 
n568 = CAENHV_SYSTEM_TYPE_t(4) 
v65xx = CAENHV_SYSTEM_TYPE_t(5) 
n1470 = CAENHV_SYSTEM_TYPE_t(6) 
v8100 = CAENHV_SYSTEM_TYPE_t(7) 

link = c_int 
LINKTYPE_TCPIP = link(0) 
LINKTYPE_RS232 = link(1) 
LINKTYPE_CAENET = link(2) 
LINKTYPE_USB = link(3) 
LINKTYPE_OPTLINK = link(4) 
LINKTYPE_USB_VCP = link(5) 

string15=c_char*15 
address=string15('1','3','7','.','1','3','8','.','1','3','.','2','0','3','\0') 

userName = c_char_p('user') 
passwd = c_char_p('user') 
ret_init = lib.CAENHVInitSystem(0, 0, address, userName, passwd) 

Когда я пытаюсь вызвать функцию, я получаю ошибку сегментации. Я думаю, что типы правильно определены. Ниже вы можете увидеть фрагмент кода, который работает нормально.

from ctypes import * 
lib2 = CDLL('/lib64/libc.so.6') 
string15=c_char*15 
address=string15('1','3','7','.','1','3','8','.','1','3','.','2','0','3','\0') 
address1=create_string_buffer('137.138.13.203') 
address2=c_char_p('137.138.13.200') 

userName = c_char_p('user') 
passwd = c_char_p('user') 

a= lib2.strncmp(address, userName, c_int(4))  
a= lib2.strncmp(userName, address, 4) 
a= lib2.strncmp(address2, address, 15) 

lib2.printf('%d\n', ret_init) 
lib2.printf('%s\n', address) 
lib2.printf('%s\n', address1) 
lib2.printf('%s\n', address2) 
lib2.printf('%d\n', lib2.strlen(address)) 
lib2.printf('%d\n', lib2.strlen(address1)) 
lib2.printf('%d\n', lib2.strlen(adrress2)) 
+1

Глядя на имеющихся документах в Интернете, он делает разницу с вами положить строку C как первый аргумент? – chuckus

+0

Вы должны отредактировать свой вопрос, чтобы показать подпись 'CAENHVInitSystem', как указано в соответствующем' .h' –

ответ

0

От быстрого поиска:

CAENHVRESULT CAENHVInitSystem(
const char *SystemName, // In 
int  LinkType, 
void  *Arg, 
const char *UserName, 
const char *Password 
); 

Первый параметр ид окончательно "указатель на символ", вы должны объявить так:

lib.CAENHVInitSystem.argtypes = [c_char_p, c_int, c_int, c_char_p, c_char_p, c_char_p] 

В дополнение:

ret_init = lib.CAENHVInitSystem(0, 0, address, userName, passwd) 
#        ^

Вы передаете NULL как SystemName (как NULL ((void*)0) на большинстве систем). Согласно the doc, я быстро прочитал, это явно не поддерживается.

Это первая функция с параметром SystemName для вызова, и он должен быть вызван для всей мощи HV поставляет пользователь хочет контролировать

+0

Я пробовал это, но это не имеет никакого значения. Я также попробовал функцию CAENHV_InitSystem, для которой требуется целое число в качестве первого аргумента, и результат тот же. Когда я пытаюсь использовать недопустимый тип ссылки (например, строку или c_int> 5), я получаю правильный результат: linktype не поддерживается. – leonardo

+0

@leonardo Вы пытались передать строку _valid_ в качестве первого параметра? –

+0

ОК: У меня 0, так что теперь он работает. – leonardo

 Смежные вопросы

  • Нет связанных вопросов^_^