2016-09-24 1 views
-1

J'ai essayé de appeler la fonction tan de math.h de cette façon (copier directement la déclaration) et il fonctionne:Luajit ffi comment appeler funcitons dans time.h?

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

Mais quand j'ai essayé d'appeler la fonction localtime de time.h de la même façon:

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

Et obtenir l'erreur:

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] 

J'ai vérifié l'offic Manuel this et this mais toujours confus.

Répondre

2

Chaque fonction que vous souhaitez appeler depuis FFI doit être définie auparavant. Si non LuaJIT ne pas comment analyser un appel de fonction FFI, comment faire la conversion de type de données de Lua à C (et viceversa), etc

Garder cela dans mon esprit, pour faire fonctionner votre code, vous auriez besoin de définir time_t et struct tm. time_t est généralement défini comme un entier signé. Vous pouvez trouver la définition de struct tm dans les documents de l'heure locale (man localtime).

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); 
]] 

En outre, la fonction localtime attend une valeur de pointeur, et non pas un nombre entier constant. Il serait donc nécessaire de passer un pointeur de données c stockant un entier à localtime. Il y a une sorte d'idiome de LuaJIT pour ça. Comme les tableaux et pointeurs en C, bien que pas exactement les mêmes, sont interchangeables dans la plupart des cas.

Enfin, vous ne pouvez pas imprimer directement un struct tm. Devrait le stocker dans une variable et imprimer les champs qui vous intéressent.

print(tm.tm_sec) 
0

Vous ne pouvez pas utiliser time_t car ce n'est pas un type C natif. Remplacez-le par le type natif approprié ou utilisez un struct typedef correspondant. Alors ça devrait marcher.