Python Ctypes传入指针并获得结构

这是我在解决实际有用问题之前尝试工作的一个简单示例。 C代码:

typedef struct { uint32_t seconds; uint32_t nanoseconds; } geoTime; int myTest(geoTime *myTime){ printf("Time: %d %d\n", myTime->seconds, myTime->nanoseconds); myTime->seconds = myTime->nanoseconds; geoTime T = {314, 159}; printf("MyTime: %d %d retValue: %d %d\n", myTime->seconds, myTime->nanoseconds, T.seconds, T.nanoseconds); return 314; } 

Python代码:

 import ctypes import time import math lib_astro = ctypes.CDLL("libastroC.so") class geoTime(ctypes.Structure): _fields_ = [("seconds", ctypes.c_uint), ("nanoseconds", ctypes.c_uint)] now = time.time() print "Python Now: ", now now_geoTime = geoTime() now_geoTime.seconds = ctypes.c_uint(int((math.floor(now)))) now_geoTime.nanoseconds = ctypes.c_uint(int(math.floor(math.modf(now)[0] * 1000000000))) print "Python geoTime now:", now_geoTime.seconds, now_geoTime.nanoseconds lib_astro.myTest.argtypes = [ctypes.POINTER(geoTime)] lib_astro.myTest.restype = geoTime print "************* ENTERING C ********************" test = lib_astro.myTest(ctypes.byref(now_geoTime)) print "************* EXITING C **********************" print "Modified now_geoTime: ",now_geoTime.seconds, now_geoTime.nanoseconds print "test: ",test 

输出:

 Python Now: 1336401085.43 Python geoTime now: 1336401085 432585000 ************* ENTERING C ******************** Time: 1336401085 432585000 MyTime: 432585000 432585000 retValue: 314 159 ************* EXITING C ********************** Modified now_geoTime: 432585000 432585000 test: 314 

上面的代码完全按照我的预期工作,我的指针进入并被修改,我得到了我的整数。 当我尝试在C中创建geoTime结构并将其返回到Python时,会出现问题。

在C中添加/修改代码:

 geoTime patTest(geoTime *myTime){ printf("Time: %d %d\n", myTime->seconds, myTime->nanoseconds); myTime->seconds = myTime->nanoseconds; geoTime T = {314, 159}; printf("MyTime: %d %d retValue: %d %d\n", myTime->seconds, myTime->nanoseconds, T.seconds, T.nanoseconds); return T; 

}

修改后的Python代码:

 lib_astro.patTest.argtypes = [ctypes.POINTER(geoTime)] lib_astro.patTest.restype = geoTime print "************* ENTERING C ********************" test = lib_astro.patTest(ctypes.byref(now_geoTime)) print "************* EXITING C **********************" print "Modified now_geoTime: ",now_geoTime.seconds, now_geoTime.nanoseconds print "Type of test: ",test print "Information in test: ", test.seconds, test.nanoseconds 

一旦我更改了我的代码,C代码就会变成myTime而不是来自Python的信息,并且返回值将被放入now_geoTime而不是test。 什么可能出错? 看起来python代码没有像我期望的那样做某事,因为C代码似乎与传入的值一起正常工作。

上一个例子的输出:

 Python Now: 1336404920.77 Python geoTime now: 1336404920 773674011 ************* ENTERING C ******************** Time: 90500 -17037640 MyTime: -17037640 -17037640 retValue: 314 159 ************* EXITING C ********************** Modified now_geoTime: 314 159 Type of test:  Information in test: 137096800 134497384 

任何想法都会非常感激,我一直试图让它工作一段时间。 提前致谢!

我切换到64位python / 64位dll,问题就消失了。 当我感觉有点灵感时,我可能会尝试将它分离到编译器,os或python但是现在我将用它来运行。