Message183661
| Author |
eli.bendersky |
| Recipients |
docs@python, eli.bendersky |
| Date |
2013年03月07日.13:58:46 |
| SpamBayes Score |
-1.0 |
| Marked as misclassified |
Yes |
| Message-id |
<1362664727.05.0.222866106319.issue17378@psf.upfronthosting.co.za> |
| In-reply-to |
| Content |
While playing with ctypes a bit, I noticed a feature that doesn't appear to be documented. Suppose I import the readdir_r function (assuming DIRENT is a correctly declared ctypes.Structure):
DIR_p = c_void_p
DIRENT_p = POINTER(DIRENT)
DIRENT_pp = POINTER(DIRENT_p)
readdir_r = lib.readdir_r
readdir_r.argtypes = [DIR_p, DIRENT_p, DIRENT_pp]
readdir_r.restype = c_int
It seems that I can then call it as follows:
dirent = DIRENT()
result = DIRENT_p()
readdir_r(dir_fd, dirent, result)
Note that while readdir_r takes DIRENT_p and DIRENT_pp as its second and third args, I pass in just DIRENT and DIRENT_p, accordingly. What I should have done is use byref() on both, but ctypes seems to have some magic applied when argtypes declares pointer types. If I use byref, it still works. However, if I keep the same call and comment out the argtypes declaration, I get a segfault.
This behavior of ctypes should be documented. |
|
History
|
|---|
| Date |
User |
Action |
Args |
| 2013年03月07日 13:58:47 | eli.bendersky | set | recipients:
+ eli.bendersky, docs@python |
| 2013年03月07日 13:58:47 | eli.bendersky | set | messageid: <1362664727.05.0.222866106319.issue17378@psf.upfronthosting.co.za> |
| 2013年03月07日 13:58:47 | eli.bendersky | link | issue17378 messages |
| 2013年03月07日 13:58:46 | eli.bendersky | create |
|