Форум сайта python.su
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png) 
			 
							 1
  1   
								
								Имеется Си объявление:
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)
Офлайн
 
							 36
  36   
								
								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])
Офлайн
 
							 1
  1   
								
								body = (c_uint8 * a.size).from_address(a.body[0])
print (body)
<__main__.c_ubyte_Array_4 object at 0x00A9A3A0>
print body[0]
Офлайн
 
							 1
  1   
								
								Метод from_address принимает собственно адрес. Непонятно как получить адрес a.body. Функция pointer дает указатель, но не адрес.
Офлайн
 
							 1
  1   
								
								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])
Офлайн
 
							 36
  36   
								
								видимо я чего-то не понимаю, почему:
body = (c_uint8 * a.size).from_address(a.body[0]) # ???
Офлайн
 
							 1
  1   
								
								потому что атрибут body не является указателем. это массив байт.
Офлайн
 
							 1
  1   
								
								a2 – это не массив, а только указатель на данные. А a1 – это живой массив. 
Вы путаете имя массива с указателями.
Офлайн
 
							 36
  36   
								
								есть функция addressof
body = (c_uint8 * a.size).from_address(addressof(a.body))
Офлайн
 
							 1
  1   
								
								точно, addressof помогла. работает.
Давно я на ctypes ничего не делал, позабывал всё.
pyuser – спасибо!
Офлайн
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png)