作者wtchen (没有存在感的人)
看板Python
标题[问题] ctypes 如何处理回传可能为NULL的函式?
时间Sat Jul 8 23:32:00 2017
最近用ctypes写一个wrapper去使用用C开发的DLL。
有一个函式是这样:
struct __abc
{
int8_t a;
.... (其他参数省略)
struct __abc* next;
} ;
然後
typedef struct __abc* ABC;
这个函式大概长这样:
ABC GetNext(ABC x)
{
return x->next; // 可以为NULL或这个linked list的下个元素
}
用ctypes包装的时候是这样:
_GetNext = _lib.GetNext
_GetNext.argtype = [ABC]
_GetNext.restype = ABC
结果我发现,如果执行的时候回传时刚好为NULL python就会出问题。
OSError: exception: access violation writing 0x00000000
请问可以怎麽解决?
感谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 90.27.156.252
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1499527922.A.535.html
1F:→ uranusjr: 你传 ABC x 为什麽里面 next 是当 pointer 用 07/09 00:11
※ 编辑: wtchen (90.27.156.252), 07/09/2017 00:50:39
抱歉,ABC应该是 struct __abc的pointer,已修正
※ 编辑: wtchen (90.27.156.252), 07/09/2017 00:51:06
2F:→ uranusjr: 这样应该是你 Python 侧的 ABC 宣告方法有问题, 正常来 07/09 01:14
3F:→ uranusjr: 说 null pointer 应该会被转换成 None 才对 07/09 01:14
因为__abc的实作是被藏起来没含在header里,所以在python我这样做:
class __abc(Structure):
pass
ABC = POINTER(__abc)
不知道这样对不对就是了....
※ 编辑: wtchen (90.27.156.252), 07/09/2017 01:22:40
※ 编辑: wtchen (90.27.156.252), 07/09/2017 01:23:54
4F:→ uranusjr: 如果是 opaque pointer 就直接用 c_void_p 07/09 01:46
5F:→ uranusjr: 不然你就要手动检查, 直接把 pointer 转 bool (False 代 07/09 01:49
6F:→ uranusjr: next = _GetNext(x); if next: print('Not null') 07/09 01:50
7F:→ uranusjr: 大概像上面这样 07/09 01:50
8F:→ wtchen: 原来如此。谢谢。 07/09 01:54
9F:推 ny8426: 推 07/09 10:11