2011-04-05 33 views
0

我嘗試使用Ctypes將C結構轉換爲Python。Python結構

我想轉換的結構是:

typedef struct LibraryInfo 
    { 
     uint32_t size;        // Size of the structure 
     char  libName[MAX_LIBRARY_NAME+1];      // Library name 
     char  provider[MAX_LIBRARY_PROVIDER_NAME+1];     // Provider 
     uint32_t version;             // Library version, i.e: 0x01030005 --> v.01.03.0005 
    } LibraryInfo; 

等效Python代碼是:

class LibraryInfo(Structure): 
    _fields_=[("size",c_uint), 
       ("libName",c_char * MAX_LIBRARY_NAME), 
       ("provider",c_char * MAX_LIBRARY_PROVIDER_NAME), 
       ("version",c_uint)] 

這需要這種結構的說法是resCode = QueryLibraryInfo(&libraryInfo);

錯誤我的功能我得到的是invalid parameters passed。 這是一個庫函數調用。我使用python HPDRLGL_MAX_LIBRARY_NAME = 200 HPDRLGL_MAX_LIBRARY_PROVIDER_NAME = 200類HPDRLGL_LibraryInfo(結構):字段 = [(「size」,c_uint),(「libName」,c_char *(HPDRLGL_MAX_LIBRARY_NAME + 1)),(「provider」 ,c_char *(HPDRLGL_MAX_LIBRARY_PROVIDER_NAME + 1)),(「version」,c_uint)]我仍然遇到同樣的錯誤,無效參數。正如你所說,我已經傳遞了一個指向結構的指針。

+3

爲什麼你會忽略'+ 1'? – kennytm 2011-04-05 07:13:17

+0

這不是一個問題。我已經作出的大小相同C. – 2011-04-05 07:17:39

回答

0

從功能上簽名,看來你需要一個指針傳遞給結構:

libraryInfo = LibraryInfo() 
resCode = QueryLibraryInfo(byref(libraryInfo)) 

而且你真的應該保持+ 1在你的結構定義。

+0

通過我在python HPDRLGL_MAX_LIBRARY_NAME使用此= 200 HPDRLGL_MAX_LIBRARY_PROVIDER_NAME = 200 類HPDRLGL_LibraryInfo(結構): _fields _ = [( 「大小」,c_uint) ( 「LIBNAME」, c_char *(HPDRLGL_MAX_LIBRARY_NAME + 1)), (「provider」,c_char *(HPDRLGL_MAX_LIBRARY_PROVIDER_NAME + 1)), (「version」,c_uint)]仍然出現同樣的錯誤,無效參數。正如你所說,我已經傳遞了一個指向結構的指針。 – 2011-04-05 08:04:24

+0

@Ashish Gupta:請不要在評論中張貼代碼。請**用正確的代碼更新**您的問題。 – 2011-04-05 11:34:12

+0

我編輯了這個問題。你能提出一些解決上述問題的方法嗎? – 2011-04-05 17:01:38