Форум сайта python.su
Есть модуль на С. в нем функция, возвращающая указатель на структуру.
struct test_struct
{
char f;
int d;
};
struct test_struct *nza_connect(void)
{
struct test_struct *connection;
connection->f = ‘d’;
connection->d = 1456;
return connection;
}
подключаю этут бибилу к Python. вызываю функцию. получаю некое число (по умолчанию ctypes возвращает int).
как мне прочитать данные из структуры?
Офлайн
Судя по коду, Вам не удастся прочитать данные из структуры :( потому как скорее всего вызов Вашей функции завершится исключением.
А на Python'е все очень просто:
from ctypes import *
class test_struct (Structure) :
_fields = [
("f", c_char),
("d", c_int),
]
nza_connect = cdll.имя_вашей_библиотеки.nza_connect
buffer = (test_struct).from_address(nza_connect())
Офлайн
> потому как скорее всего вызов Вашей функции завершится исключением
Ну почему же, может и повезет :-).
Хотя я бы не стал работать с таким кодом и уж точно бы не доверял результату этой функции, но я фиговый знаток C, так что…
..bw
Офлайн
в общем сам со всем рзобрался.
просто надо сначала получить адрес куда нить, а потом по этому адресу уже прочесть. а для освобождения передать адрес и все.
но вот осталась еще одна трабла.
имеем следующий код на С (бибилотека):
#include <stdlib.h>
struct test_struct
{
void *addr_struct;
char f;
int d;
};
struct test_struct *nza_connect(void)
{
struct test_struct *connection;
connection = malloc(sizeof(struct test_struct));
if(connection == NULL)
{
return 0;
}
connection->addr_struct = connection;
connection->f = 'd';
connection->d = 1456;
return connection;
}
...
class t_struct(Structure):
_fields_ = [('addr', c_void_p), ('f', c_char), ('d', c_int)]
addr_struct = nza.nza_connect()
buffer = (test_struct).from_address(addr_struct)
Отредактировано (Июль 15, 2009 14:15:46)
Офлайн
nza.nza_connect.restype = POINTER(t_struct)
Это - рекомендуемый способ. Хотя, конечно, всегда можно проявить фантазию…
Офлайн