Найти - Пользователи
Полная версия: ctypes: Получение данных из структуры.
Начало » Python для экспертов » ctypes: Получение данных из структуры.
1
eXeC001er
Есть модуль на С. в нем функция, возвращающая указатель на структуру.

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).
как мне прочитать данные из структуры?
pyuser
Судя по коду, Вам не удастся прочитать данные из структуры :( потому как скорее всего вызов Вашей функции завершится исключением.

А на 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())
bw
> потому как скорее всего вызов Вашей функции завершится исключением
Ну почему же, может и повезет :-).
Хотя я бы не стал работать с таким кодом и уж точно бы не доверял результату этой функции, но я фиговый знаток C, так что…

..bw
eXeC001er
в общем сам со всем рзобрался.
просто надо сначала получить адрес куда нить, а потом по этому адресу уже прочесть. а для освобождения передать адрес и все.
но вот осталась еще одна трабла.

имеем следующий код на С (бибилотека):
#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;
}
вызываем эту функцию из Python:
...

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)
в итоге получаем что переменная “addr_struct” не равна переменной buffer.addr
порядок адресов следующий (к примеру):
addr_struct = 33580944
buffer.addr = 6257553902180
почему?
Андрей Светлов
nza.nza_connect.restype = POINTER(t_struct)

Это - рекомендуемый способ. Хотя, конечно, всегда можно проявить фантазию…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB