2016-09-24 14 views
-1

私はこのようmath.hの機能tanを呼び出そうとしました(直接宣言をコピー)し、それが動作:時間の関数funcitonsを呼び出す方法は?

local ffi = require("ffi") 
ffi.cdef[[ 
    double tan(double x); 
]] 
print(ffi.C.tan(45)) 

しかし、私は同じようtime.hの機能localtimeを呼び出すしようとしたとき:

local ffi = require("ffi") 
ffi.cdef[[ 
    struct tm *localtime(const time_t *tp); 
]] 
print(ffi.C.localtime(1234544)) 

エラー:

lua: C:\Users\xiang\Desktop\bm.lua:4: declaration specifier expected near 'time_t' 
stack traceback: 
    [C]: in function 'cdef' 
    C:\Users\xiang\Desktop\bm.lua:4: in main chunk 
    [C]: at 0x00401f00 
[Finished in 0.1s with exit code 1] 

私は役人を確認しましたial manual thisthisしかし、まだ混乱しています。

答えて

2

FFIから呼び出すすべての機能は、事前に定義する必要があります。 LuaJITでFFI関数呼び出しを解析する方法、LuaからC(およびviceversa)などのデータ型変換を行う方法がない場合は、

コードを作業する必要があります。 time_tstruct tmを定義します。 time_tは一般に符号付き整数として定義されます。 struct tmの定義は、ローカルタイムズドキュメント(男性ローカルタイム)にあります。また

ffi.cdef[[ 
    struct tm { 
     int tm_sec; /* Seconds (0-60) */ 
     int tm_min; /* Minutes (0-59) */ 
     int tm_hour; /* Hours (0-23) */ 
     int tm_mday; /* Day of the month (1-31) */ 
     int tm_mon; /* Month (0-11) */ 
     int tm_year; /* Year - 1900 */ 
     int tm_wday; /* Day of the week (0-6, Sunday = 0) */ 
     int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */ 
     int tm_isdst; /* Daylight saving time */ 
    }; 
    struct tm *localtime(const int32_t *tp); 
]] 

、機能localtimeがポインタ値ではなく、一定の整数を期待。したがって、整数を格納するcデータポインタをlocaltimeに渡す必要があります。それには一種のLuaJITイディオムがあります。

local time = ffi.new("int32_t[1]") 
time[0] = 1234544 
local tm = C.localtime(time) 

Cの配列とポインタは、まったく同じではありませんが、ほとんどの場合互換性があります。

最後に、struct tmは直接印刷できません。それを変数に格納し、興味のあるフィールドを出力する必要があります。

print(tm.tm_sec) 
0

ネイティブCタイプではないため、time_tは使用できません。適切なネイティブ・タイプに置き換えるか、対応するstruct typedefを使用してください。そうすればうまくいくはずです。

関連する問題