2010-02-27 9 views
7

Ich bin in Lua in eine C/C++ - Anwendung eingebettet. Gibt es eine Möglichkeit, eine Lua-Funktion von C/C++ aufzurufen, ohne zuerst das gesamte Skript auszuführen?Aufruf von Lua-Funktion ohne Skript auszuführen

Ich habe versucht, dies zu tun:

//call lua script from C/C++ program 
luaL_loadfile(L,"hello.lua"); 

//call lua function from C/C++ program 
lua_getglobal(L,"bar"); 
lua_call(L,0,0); 

Aber es gibt mir diese:

PANIC: unprotected error in call to Lua API (attempt to call a nil value) 

ich nur bar() aufrufen können, wenn ich dies tun:

//call lua script from C/C++ program 
luaL_dofile(L,"hello.lua"); //this executes the script once, which I don't like 

//call lua function from C/C++ program 
lua_getglobal(L,"bar"); 
lua_call(L,0,0); 

Aber es gibt mir das:

hello 
stackoverflow!! 

ich dies wollen:

stackoverflow! 

Das ist mein lua Skript:

print("hello"); 

function bar() 
print("stackoverflow!"); 
end 
+1

Da Sie das Skript ausführen, um die Lua VM, um es zu sehen, wie Etan angezeigt Sie 'extrahieren aus Funktion bar() 'zu einer anderen Datei und nur diese Datei ausführen. – greatwolf

Antwort

13

Wie einfach nur in #lua auf freenode luaL_loadfile diskutiert die Datei in ein aufrufbar chunk kompiliert, an diesem Punkt Keiner der Code innerhalb der Datei wurde ausgeführt (was die Funktionsdefinitionen beinhaltet), damit die Definition von bar ausgeführt werden kann, muss der Chunk aufgerufen werden (was luaL_dofile tut).

+0

Ich war die Person, die das im Chat fragte: P – Person

+0

Ich dachte, du wärst, aber ich dachte, ich würde die Referenz trotzdem explizit machen, nur für den Fall. –

1

festgestellt, dass das Skript ausgeführt werden muss, um die Funktion aufzurufen.

0

Eine mögliche Lösung/Hack (und bitte bedenken Sie, dass ich zur Zeit nicht in der Lage bin, dies zu testen) ...


eine Dummy-Einfügen "Rückkehr"; Zeile an der Spitze Ihres LUA-Codes.

  • Legen Sie die Datei in einen String (wie Sie in der Vorbereitung würde für die Verwendung von luaL_loadstring())
  • Nun sollte es einfach eine Frage der Verwendung printf_s("return;\r\n%s", [pointer to string holding actual LUA code])
  • Jetzt sein können Sie die verkettete Zeichenfolge
luaL_loadstring()

Der Code wird immer noch ausgeführt, aber er sollte abgeschnitten werden, bevor er irgendetwas erreichen kann, was etwas bewirkt (in Ihrem Beispiel wäre die Druckzeile unerreichbar). Es sollte noch die Liste aller Funktionsprototypen aktualisiert haben und Sie sollten jetzt lua_get() verwenden können, um die Funktionen zu referenzieren.


HINWEIS: Für diejenigen, die nicht wissen "\ r \ n" sind die Escape-Codes eine neue Zeile auf dem Windows-Betriebssystem darstellt, und es MUST diese Schrägstriche sein ...IE: THIS \ r \ n NICHT THIS /r/n

Verwandte Themen