2014-08-31 4 views
3

Скажем, у меня есть эта функция C:LuaJit FFI Возвращает строку от функции C до Lua?

__declspec(dllexport) const char* GetStr() 
{ 
    static char buff[32] 

    // Fill the buffer with some string here 

    return buff; 
} 

И этот простой модуль Lua:

local mymodule = {} 

local ffi = require("ffi") 

ffi.cdef[[ 
    const char* GetStr(); 
]] 

function mymodule.get_str() 
    return ffi.C.GetStr() 
end 

return mymodule 

Как я могу получить возвращенную строку из функции C в виде строки Lua здесь:

local mymodule = require "mymodule" 

print(mymodule.get_str()) 
+0

Что вы получаете, как сейчас? Что делает этот код, который вам не нужен? –

+0

В настоящее время, когда я печатаю, я получаю 'cdata : 0x00000001' вместо строки. Из документации я должен использовать 'ffi.string (buff [, len])' для получения фактической строки. Но когда я делаю это, приложение падает. –

+1

Показать вызов 'ffi.string', который вы пытались, и обратную трассировку/etc. от аварии. В идеале также код, который заполняет строку. –

ответ

5

Функция ffi.string, по-видимому, выполняет преобразование, которое вы ищете.

function mymodule.get_str() 
    local c_str = ffi.C.GetStr() 
    return ffi.string(c_str) 
end 

Если вы получаете сбой, то убедитесь, что ваша строка С нулем, а в вашем случае, имеет не более 31 characterss (так, чтобы не переполнить его буфер).

+0

Я пробовал это, но приложение вылетает. Я думал, что что-то не так: -/ –

+0

Возможно, ваша строка слишком длинная и переполняет буфер? – hugomg

+1

Оказывается, что я просчитал что-то, и вместо него было возвращено целое число. Спасибо всем за ваши ответы, и я приношу свои извинения за неудобства. –