2014-09-23 16 views
5

Mi occupo di picosecondi nel mio codice (i numeri sono> 10^12).
codice C passare i dati a Lua (atime e eventid sono entrambi di tipo size_t)Lua C api: gestione di grandi numeri

lua_getglobal (luactx, "timer_callback"); 
lua_pushunsigned (luactx, atime); 
lua_pushunsigned (luactx, eventid); 
lua_pcall (luactx, 2, 0, 0); 

funzione Lua

function timer_callback(time, eventid) 
    if eventid == TX_CLOCK then 
    out_log(tostring(time)) --result is random garbage 
    set_callback(time + 1000000000000, TX_CLOCK) 
    return 
    end 
end 

ho provato con lua_pushnumber ma risultati sulla lua Ho numeri negativi.

+1

Quale versione di lua? 5.3 supporta 'lua_Integer', che è 64 bit per impostazione predefinita. – indiv

+0

Io uso 5.2 sotto Win32 – pugnator

+0

indiv, si prega di rendere il vostro messaggio come risposta. Ho appena compilato 5.3 da fonti, ricompilato la mia applicazione e tutto ha funzionato come un incantesimo – pugnator

risposta

5

Lua, a partire da 5.3, supporta lua_Integer, che è 64 bit per impostazione predefinita. Dal reference manual:

lua_Integer

typedef ... lua_Integer;

Il tipo di numeri interi in Lua.

Per impostazione predefinita, questo tipo è lungo (di solito un numero intero a 64-bit a due componenti), ma può essere modificato su long o int, in genere un numero intero a 32 bit a due componenti. (Vedere LUA_INT in luaconf.h.) Lua definisce anche le costanti LUA_MININTEGER e LUA_MAXINTEGER, con i valori minimo e massimo che si adattano a questo tipo.

Lua 5.2 lua può essere costretto ad utilizzare un diverso tipo di numero abbastanza facilmente modificando luaconf.h. Il tipo di numero è definito come LUA_NUMBER.

Per lua 5.1, è possibile installare la patch lnum, che cambierà il tipo di intero.