Уведомления

Группа в Telegram: @pythonsu

#1 Июль 14, 2009 23:02:22

eXeC001er
От:
Зарегистрирован: 2009-06-22
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

ctypes: Получение данных из структуры.

Есть модуль на С. в нем функция, возвращающая указатель на структуру.

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).
как мне прочитать данные из структуры?



Офлайн

#2 Июль 15, 2009 02:06:09

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

ctypes: Получение данных из структуры.

Судя по коду, Вам не удастся прочитать данные из структуры :( потому как скорее всего вызов Вашей функции завершится исключением.

А на 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())



Офлайн

#3 Июль 15, 2009 07:09:13

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

ctypes: Получение данных из структуры.

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

..bw



Офлайн

#4 Июль 15, 2009 07:20:38

eXeC001er
От:
Зарегистрирован: 2009-06-22
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

ctypes: Получение данных из структуры.

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

имеем следующий код на С (бибилотека):

#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
почему?



Отредактировано (Июль 15, 2009 14:15:46)

Офлайн

#5 Июль 15, 2009 19:43:30

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ctypes: Получение данных из структуры.

nza.nza_connect.restype = POINTER(t_struct)

Это - рекомендуемый способ. Хотя, конечно, всегда можно проявить фантазию…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version