2013-06-28 6 views
1

Я создаю структуру ctype. У меня есть внешняя функция, которая требует указания указателя на эту структуру. Предполагается, что структура ctype имеет указатель на пустоту.Python Ctypes преобразует указатель void в nonetype и long. Каковы последствия? Что это значит?

Пример прототип функции:

ExtFunc(
TestStruct* myVoidStruct 
); 

где мой C-эквивалентная структура определяется следующим образом:

typedef struct voidStruct 
{ 
    void* voidField; 
} voidStruct; 

Я пытаюсь создать такую ​​структуру, но неизменно указатель недействительным интерпретируется Python как нечто иное, чем указатель на пустоту.

Каковы последствия этого, если таковые имеются? Означает ли это, что внешняя функция также интерпретирует этот элемент структуры как нечто иное, чем указатель на пустоту?

>>> class TestStruct(ctypes.Structure): 
    _fields_ = [("voidField", ctypes.c_void_p)] 

>>> x = TestStruct() 

И сразу же, voidField возвращается как NoneType

>>> type(x.voidField) 
<type 'NoneType'> 

Но, я могу создать и поддерживать пустой указатель за пределами структуры:

>>> y = ctypes.c_void_p(123) 
>>> y 
c_void_p(123L) 

Как я уже сказал выше, я передаю свою структуру внешней функции. Когда функция завершается, структура элементов типа «длинный», с соответствующим значением

>>> x.voidField 
88145984L 
>>> type(x.voidField) 
<type 'long'> 

Почему теперь тип долго? И каково значение его ценности? Это адрес памяти указателя? Адрес памяти, на который указывает указатель? Или это значение первых нескольких байтов по адресу памяти, на который он указывает?

ответ

3

И сразу же, voidField возвращается как NoneType

Это только потому, что NULL указатель переводится на Python None ...

>>> from ctypes import * 
>>> class TestStruct(Structure): 
... _fields_ = [("voidField", c_void_p)] 
... 
>>> x.voidField = 0 
>>> print repr(x.voidField) 
None 

Почему это теперь тип длинный?

Как только вы установите указатель на что-то, отличное от нуля, то это будет либо Python int или Python long ...

>>> x.voidField = 123 
>>> print repr(x.voidField) 
123 

И каково значение его стоимости ?

Это адрес, на который указывает указатель void *, то есть то, что вы получите от чего-то вроде ...

void* ptr = malloc(1000); 
printf("%ld\n", (long) ptr); 
0

Указатели C являются целыми числами, где значение является адресом памяти указателя на вещь. Тип указателя - это всего лишь подсказка для того, чтобы узнать, сколько байтов захватить при разыменовании.

 Смежные вопросы

  • Нет связанных вопросов^_^