[英]C structure definition translated to Python
我有一個 C/C# 庫,其中包含一個函數functionName(int index, DataTypeDef data[], int count);
.
DataTypeDef 的定義:
struct DataTypeDef
{
public int id;
public float par1;
public int par2;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public float[] result;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public float[] result2;
public Int64 par3;
public Int32 par4;
};
問題是如何使用 ctypes 正確地將這部分轉換為 Python 並執行該函數。 我嘗試將結構定義如下:
import ctypes as c
class DataTypeDef(c.Structure):
_fields_ = [
("id",c.c_int),
("par1",c.c_float),
("par2",c.c_int),
("result",c.c_float*10),
("result2",c.c_float*20),
("par3",c.c_long),
("par4",c.c_long),
]
沒有成功; 函數執行時:
r_index = (c.c_int)(1)
r_data = (DataTypeDef)()
r_count = (c.c_int)(1)
functionName(r_index,r_data,r_count)
python內核就死了。 其他不使用結構的函數正常執行
您的類定義中的某些類型不正確。 最后兩個參數不匹配。 c_long
可能適用於其中之一,但不能同時適用於兩者。
class DataTypeDef(c.Structure):
_fields_ = (("id",c.c_int),
("par1",c.c_float),
("par2",c.c_int),
("result",c.c_float*10),
("result2",c.c_float*20),
("par3",c.c.c_int64), # 8-byte size
("par4",c.c_int32)) # 4-byte size
您還應該檢查 C 結構定義中的填充聲明,例如#pragma pack(push,1)
或類似聲明。 如果需要刪除填充,您可以定義_pack_ = 1
。 例如,上面的結構通常是 152 字節(在result2
和par4
之后添加 4 字節填充)和 144 字節,1 字節打包。 原始的不正確結構的大小為 140 字節,無論是否打包都太小,很可能是由於結構溢出導致 Python 崩潰的原因。
它還有助於printf("%zu\n", sizeof(DatatypeDef));
在 C 和print(ctypes.sizeof(DataTypeDef))
在 Python 中,以確保他們同意。 差異可能表示結構或填充錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.