2014-11-05 37 views
0

我試圖打印存儲在固定數組中的以空字符結尾的字符串的內容。該數組在開始時memset'd爲零,然後填充以空字符結尾的字符串。我正在嘗試打印字符串。如何在LuaJIT中打印固定數組的字符?

這工作:

ffi.cdef[[ 
typedef struct _t 
{ 
    uint16_t i; 
    const char * name; 
} MyStruct; 
]] 

ffi.cdef[[ 
MyStruct* Get(); 
]] 

local myDll = ffi.load("myDll") 
local x = myDll.Get() 
print("Name: %s", x.name) 

這將導致一個錯誤:

ffi.cdef[[ 
typedef struct _t 
{ 
    uint16_t i; 
    char name[25]; 
} MyStruct; 
]] 

ffi.cdef[[ 
MyStruct* Get(); 
]] 

local myDll = ffi.load("myDll") 
local x = myDll.Get() 
print("Name: %s", x.name) 

第二產生這個錯誤:

27: bad argument #2 to 'print' (cannot convert 'char [25]' to 'char (&)[25]') 

注:代碼由原來的編輯爲此發佈沒有編譯它。我看起來我不正確地處理數組。什麼是正確的方法來做到這一點?

回答

0

無法使用打印功能直接打印C字符串。你需要要麼先轉換到一個Lua字符串或使用C printf功能

print("Name: ", ffi.string(x.name)) 

ffi.C.printf("Name: %s", x.name) -- Note: need to cdecl printf first 
+0

此外,我建議對與工作方式不同的功能替換內置函數;它會讓你的代碼對其他程序員感到困惑。這個答案假設你正在使用內置的'print'功能。 – 2014-11-05 13:12:01

+0

然後一個相關的問題。您如何建議將所有打印件分流到日誌文件? – 010110110101 2014-11-05 13:15:57

+0

重定向stdout或使用日誌記錄庫。但是,如果你必須重寫print,那麼至少應該使用相同的參數; 'print'不採用格式字符串,而是用分隔它們的選項卡寫入每個參數。 – 2014-11-05 13:18:29