2015-10-08 47 views
1

我面臨着一個問題,當我試圖使用加載浮動到Python程序​​ctypes的漂浮垃圾回報

C代碼:

float test_ret_float(){ 
    return 1.0; 
} 

在Python中,所有的方式,導致垃圾:

print lib.test_ret_float() 
>>1074161254 
print c_float(lib.test_ret_float()).value 
>>1074161280.0 

如果是int所有工作正常。

看來,該類型的會話不能按預期的方式工作,並且確實返回raw 4字節值不會轉換爲float而是int,爲什麼?

回答

1

的問題是,我錯過了restype設置:

lib.test_ret_float.restype = c_float 

解決該問題

+1

的原因是'float'是無論從FPU組返回(如'的x87指令fstp' ),或者在x64中使用SSE寄存器(例如'xmm0')。所以'c_float'或'c_double'返回類型必須專門處理。默認的'c_int'結果(例如,來自x64寄存器'rax')是垃圾,與函數的返回值無關。 – eryksun