2013-10-15 3 views
7

Ho appena creato con successo un progetto lua. (Un codice semplice che esegue finora uno script lua.)
Ma come faccio a rendere una funzione C++ e una variabile C++ disponibili per lo script lua ora?Come esporre le funzioni C++ a uno script lua?

Per fare un esempio:

int Add(int x, int y) { 
    return x + y; 
} 

e

float myFloatValue = 6.0 

Sono molto nuovo per C++ così spero davvero che non sarà troppo complicato. Ecco il codice che ho avuto finora btw:

#include "stdafx.h" 
extern "C" { 
    #include "lua.h" 
    #include "lualib.h" 
    #include "lauxlib.h" 
} 

using namespace System; 

int main(array<System::String ^> ^args) 
{ 
    lua_State* luaInt; 
    luaInt = lua_open(); 
    luaL_openlibs (luaInt); 
    luaL_dofile (luaInt, "abc.lua"); 
    lua_close(luaInt); 
    return 0; 
} 
+1

Controllare questo: http://lua-users.org/wiki/BindingCodeToLua – user1095108

risposta

11

Verrò con la risposta di John Zwinck come l'esperienza mi ha dimostrato che l'uso di Lua da solo è un dolore nel sedere. Ma se vuoi sapere la risposta controlla il resto.

Per registrare le funzioni C/C++ è necessario prima fare la vostra funzione sguardo come un modello di funzione C standard che Lua prevede:

extern "C" int MyFunc(lua_State* L) 
{ 
    int a = lua_tointeger(L, 1); // First argument 
    int b = lua_tointeger(L, 2); // Second argument 
    int result = a + b; 

    lua_pushinteger(L, result); 

    return 1; // Count of returned values 
} 

Ogni funzione che deve essere registrato in Lua dovrebbe seguire questo modello. Tipo di reso int, parametro singolo lua_State* L. E il conteggio dei valori restituiti.

Quindi, è necessario registrarlo nella tabella registro di Lua in modo da poter esporre al contesto del vostro script:

lua_register(L, "MyFunc", MyFunc); 

Per la registrazione variabili semplici è possibile scrivere questo:

lua_pushinteger(L, 10); 
lua_setglobal(L, "MyVar"); 

Dopo di che , puoi chiamare la tua funzione da uno script Lua. Tieni presente che dovresti registrare tutti i tuoi oggetti prima di eseguire qualsiasi script con lo stato di Lua specifico che hai usato per registrarli.

In Lua:

print(MyFunc(10, MyVar)) 

Risultato:

+0

'MyFunc' deve essere" extern "C" '. – Simple

+0

@Simple Sì, ho pensato che Lua fosse inclusa con "extern" C "' quindi non l'ho menzionato. – MahanGM

+3

questo è esattamente il motivo per cui 'MyFunc' deve essere" extern "C" '. 'lua_CFunction' è un puntatore a funzionare con il collegamento C ma' MyFunc' ha un collegamento C++. Lo standard dice che questi sono due tipi distinti quindi non dovrebbe essere compilato (sebbene la maggior parte dei compilatori tradizionali lo accettino erroneamente). – Simple

2

piuttosto che farlo utilizzando l'API Lua C, io suggerisco di usare Luabind.

Luabind è una libreria di alto livello appositamente creata per esporre le classi e le funzioni C++ a Lua. Senza usare le funzioni API di Lua C, senza manipolare lo stack Lua, ecc. È ispirato a Boost Python, quindi se ne impari uno capirai principalmente l'altro.

+0

o [LuaBridge] (http: // vinniefalco.com/LuaBridge/Manual.html) nel caso in cui l'autore non voglia utilizzare Boost. –