Форум сайта python.su
Имеется Си объявление:
typedef struct CFMessageBase {
unsigned long msg_code;
unsigned long size;
unsigned char body[1];
} CFMessageBase, *PCFMessageBase;
class CFMessageBase(Structure):
_fields_ = [
('msg_code', c_ulong),
('size', c_ulong),
('body', c_uint8 * 1),
]
a = CFMessageBase()
print a.body[1]
Traceback (most recent call last):
File "C:\Temp\1\test.py", line 14, in <module>
print a.body[1]
IndexError: invalid index
Отредактировано (Окт. 2, 2009 13:47:24)
Офлайн
class CFMessageBase(Structure):
_fields_ = [
('msg_code', c_ulong),
('size', c_ulong),
('body', c_ulong),]
a = CFMessageBase()
body = (c_uint8 * a.size).from_address(a.body)
for i in xrange(a.size): print(body[i])
Офлайн
body = (c_uint8 * a.size).from_address(a.body[0])
print (body)
<__main__.c_ubyte_Array_4 object at 0x00A9A3A0>
print body[0]
Офлайн
Метод from_address принимает собственно адрес. Непонятно как получить адрес a.body. Функция pointer дает указатель, но не адрес.
Офлайн
pyuserВаш код не работает. a.body – это значение, а не адрес.class CFMessageBase(Structure):
_fields_ = [
('msg_code', c_ulong),
('size', c_ulong),
('body', c_ulong),]
a = CFMessageBase()
body = (c_uint8 * a.size).from_address(a.body)
for i in xrange(a.size): print(body[i])
Офлайн
видимо я чего-то не понимаю, почему:
body = (c_uint8 * a.size).from_address(a.body[0]) # ???
Офлайн
потому что атрибут body не является указателем. это массив байт.
Офлайн
a2 – это не массив, а только указатель на данные. А a1 – это живой массив.
Вы путаете имя массива с указателями.
Офлайн
есть функция addressof
body = (c_uint8 * a.size).from_address(addressof(a.body))
Офлайн
точно, addressof помогла. работает.
Давно я на ctypes ничего не делал, позабывал всё.
pyuser – спасибо!
Офлайн