我正在使用ctypes從python調用C DLL。對于大多數功能,所有功能都可以正常工作。但是...現在我有一個需要輸入十六進制常量的函數,而且我似乎無法正確傳遞它。我沒有C源代碼,但是從文檔中可以看到,函數定義如下:sensv_bn* NewSensvToFinding_bn (const node_bn* Qnode, const nodelist_bn* Vnodes, int what_find)我幾乎可以肯定我正在傳遞Qnode并且Vnodes正確,因為它們是由DLL中的其他函數創建的。問題是與int所謂的what_find。從DLL附帶的頭文件中,我看到以下行: enum {ENTROPY_SENSV = 0x02, REAL_SENSV = 0x04, VARIANCE_SENSV = 0x100, VARIANCE_OF_REAL_SENSV = 0x104}; /* for NewSensvToFinding_bn */我要傳遞what_find的值VARIANCE_OF_REAL_SENSV是十六進制值0x104。我試著不經過轉換就傳遞了它,也使用ctypes.c_int(0x104)了它,將其強制轉換為int,但是函數返回的是0而不是指針。我也嘗試過不經過轉換而得到相同的結果。我應該執行更適當的轉換嗎?我有點C n00b,如果這是一個非常幼稚的問題,抱歉。
2 回答

蕪湖不蕪
TA貢獻1796條經驗 獲得超7個贊
Python和C都允許您使用十六進制文字定義整數。它們被解釋為以16為底,但是它們的值仍然是整數。對于相同的值,它不過是一種替代的表示法:
>>> 0x02
2
>>> 0x104
260
>>> import ctypes
>>> ctypes.c_int(0x104)
c_int(260)
您還可以使用八進制(0o404,或者僅在python 2中使用0404)或二進制(0b100000100)表示法來指定相同的整數值。
簽名指定它需要一個int,因此傳入一個整數值。如果需要,可以在Python源代碼中將該整數值指定為十六進制文字,但是C代碼只需要一個整數值,并且不管是否使用十六進制表示法創建該值。
如果函數調用不能使用正確的常量,則其他問題是錯誤的。

慕容708150
TA貢獻1831條經驗 獲得超4個贊
萬一有興趣的人,問題是我得到的返回0表示函數運行正常。我需要的是函數實際返回的浮點數,該浮點數是通過使用restype方法并將其設置為ctypes.c_double獲得的。輸入的十六進制問題導致出現紅色鯡魚,但是對于學習Python和C如何處理十六進制值非常有用。
添加回答
舉報
0/150
提交
取消