У меня есть следующий C-код, который я бы использовал из скрипта Python.
Это всего лишь выдержка из автоматически сгенерированной огромной библиотеки, которую я, к сожалению, не могу изменить.Здесь я просто хотел вывести элементы структуры на консоль, чтобы продемонстрировать, что происходит не так.
// CFunc.h
#include <stdio.h>
typedef struct
{
int npar;
struct
{
int id;
int value;
} params[10];
} Data_t;
void Cfunc( const Data_t * d);
// CFunc.c
#include "CFunc.h"
void Cfunc( const Data_t * d)
{
int inpar = 0;
int maxnpar = 0;
printf("%d:\n", d->npar);
maxnpar = d->npar;
inpar=0;
while (maxnpar > inpar)
{
printf(" %d: %08x %08x\n", inpar, d->params[inpar].id, *(int*)&d->params[inpar].value);
inpar++;
}
}
Он скомпилирован и связан с библиотекой общего доступа с помощью:
gcc -fPIC -c CFunc.c -o CFunc.o
gcc -shared -lrt -Wl, -soname, libCFunc.so.1 -o libCFunc.so CFunc.o
Так я и сделалследующая реализация с использованием ctypes:
from ctypes import *
lib = CDLL('./libCFunc.so')
class Data_2(Structure):
pass
class Data_t(Structure):
def __init__(self, list):
self.npar = len(list)
self.params = (Data_2 * self.npar)(*list)
Data_2._fields_ = [
('id', c_int),
('value', c_int),
]
Data_t._fields_ = [
('npar', c_int),
('params', POINTER(Data_2)),
]
def pyFunc(d):
lib.Cfunc.argtypes = (POINTER(Data_t),)
lib.Cfunc(byref(d))
return
Итак, я инициализирую структуру из списка заданных кортежей, в данном случае просто 2 и вызываю C-функцию, чтобы увидеть ее вывод.
paramlist = (
( 0x050000000, 0x00000000 ),
( 0x050000001, 0x447a0000 ) )
temp = Data_t(paramlist)
pyFunc(temp)
К сожалению, результат не такой, как ожидалось:
2:
0: 00000000 79948ef0
1: 00007fe5 00000000
Любые мысли, чтоЯ скучаю?