2011-07-14 35 views
7

Giả sử p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char)).Python: cách tăng một ví dụ ctypes POINTER

Vì vậy, chúng tôi có p.contents.value == "f".

Làm cách nào để truy cập và thao tác trực tiếp (ví dụ: tăng dần) con trỏ? Ví dụ. như (p + 1).contents.value == "o".

+0

Đây không phải là luôn luôn là một ý tưởng nóng như vậy trong C; để thấy ai đó muốn áp dụng nó cho Python làm tôi sợ một chút. –

Trả lời

7

Bạn phải sử dụng lập chỉ mục:

>>> p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char)) 
>>> p[0] 
'f' 
>>> p[1] 
'o' 
>>> p[3] 
'\x00' 

Có một cái nhìn tại ctypes documentation để tìm hiểu thêm về việc sử dụng con trỏ.

CẬP NHẬT: Dường như đó không phải là những gì bạn cần. Hãy thử, sau đó, hãy thử một cách tiếp cận khác: đầu tiên bỏ con trỏ để void, increment nó và sau đó cast nó trở lại LP_c_char:

In [93]: p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char)) 

In [94]: void_p = ctypes.cast(p, ctypes.c_voidp).value+1 

In [95]: p = ctypes.cast(void_p, ctypes.POINTER(ctypes.c_char)) 

In [96]: p.contents 
Out[96]: c_char('o') 

Có lẽ nó không thanh lịch nhưng nó hoạt động.

+0

Điều này không thực sự trả lời câu hỏi của tôi. Tôi thực sự muốn sửa đổi/tăng 'p'. Nếu 'p' sẽ là' c_void_p', tôi có thể làm 'p.value + = 1'. – Albert

+0

@Albert, tôi đã cập nhật câu trả lời của mình. –

4

Sau khi trở lại điều này, tôi đã tìm ra câu trả lời của @ Michał Bentkowski vẫn chưa đủ cho tôi vì nó không sửa đổi con trỏ ban đầu.

Đây là giải pháp hiện tại của tôi:

a = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char)) 
aPtr = ctypes.cast(ctypes.pointer(a), ctypes.POINTER(c_void_p)) 
aPtr.contents.value += ctypes.sizeof(a._type_) 

print a.contents 
Các vấn đề liên quan