簡體   English   中英

翻譯成 Python 的 C 結構定義

[英]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 字節(在result2par4之后添加 4 字節填充)和 144 字節,1 字節打包。 原始的不正確結構的大小為 140 字節,無論是否打包都太小,很可能是由於結構溢出導致 Python 崩潰的原因。

它還有助於printf("%zu\n", sizeof(DatatypeDef)); 在 C 和print(ctypes.sizeof(DataTypeDef))在 Python 中,以確保他們同意。 差異可能表示結構或填充錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM