C++°ú °°ÀÌ ¿¬µ¿Çؼ °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â ½ºÅ©¸³Æ®´Â ·ç¾ÆÀÌ´Ù. ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯´Â ÄÄÆÄÀÏ·¯°¡ ¼³Ä¡ µÇ¾î ÀÖÁö ¾Ê¾Æµµ ÇÁ·Î±×·¥ È帧ÀÇ º¯°æÀ» ÇÒ ¼ö ÀÖ°í, ÄÄÆÄÀÏÀ» ´Ù½Ã ÇÒ ÇÊ¿ä°¡ ¾ø±â ¶§¹®ÀÌ´Ù. ·ç¾Æ 5.1À» »ç¿ëÇؼ ÁøÇàÇÑ´Ù.
¿©±â¼´Â ´ÙÀ½ÀÇ ¼ø¼·Î ÁøÇàÇÑ´Ù.
1. ·ç¾Æ ¼³Ä¡ ¹× ºôµå
2. ·ç¾Æ ÃʱâÈ
3. ·ç¾Æ ÇØÁ¦
4. C++¿¡¼ ·ç¾Æ ÇÔ¼ö È£Ãâ
5. ·ç¾Æ¿¡¼ C++ È£Ãâ
6. ·ç¾ÆÀÇ º¯¼ö°ª ÀÐ¾î ¿À±â
|
1. ·ç¾Æ ¼³Ä¡ ¹× ºôµå
·ç¾Æ ´Ù¿î·Îµå: http://www.lua.org/ Download ½ÎÀÌÆ® °¡¼ Binaries Ç׸ñ¿¡¼ À©µµ¿ìÁî Æ÷±×·¥À» ´Ù¿î ¹Þ´Â´Ù. Á÷Á¢ ¶óÀ̺귯¸®¸¦ ºôµåÇؼ »ç¿ëÇÑ´Ù¸é ¼Ò½º¸¸ ¹Þ¾Æµµ ÁÁ´Ù.
¾ÐÃàÀ» Ç®°í ºñÁê¾ó ½ºÆ©µð¿À¿¡¼ ´ÙÀ½°ú °°ÀÌ Æú´õ¸¦ ¼³Á¤ÇÑ´Ù.
C++ Æ÷ÇÔ Æú´õ ¼³Á¤: <·ç¾Æ ¼³Ä¡ Æú´õ>/include
C++ ¶óÀ̺귯¸® Æú´õ ¼³Á¤ <·ç¾Æ ¼³Ä¡ ¶óÀ̺귯¸®>/lua-5.1/lib
Çì´õ ÆÄÀÏÀ» Æ÷ÇÔ ½ÃŲ´Ù.
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
|
¶óÀ̺귯¸®¸¦ Æ÷ÇÔ ½ÃŲ´Ù.
#pragma comment (lib, "lua51.lib")
#pragma comment (lib, "lua5.1.lib)
|
2. ·ç¾Æ ÃʱâÈ
lua_open ÀÌÈÄ ¿©·¯ °¡Áö ÃʱâÈ ÇÔ¼ö°¡ ÀÖ¾úÁö¸¸ 5.1ºÎÅÍ´Â luaL_openlibs ¸¸ ½ÇÇàÇÏ¸é µÈ´Ù.
lua_State* L = lua_open();
luaL_openlibs(L);
|
3. ·ç¾Æ ÇØÁ¦
lua_open¿¡¼ »ý¼ºµÈ ·ç¾Æ ÀνºÅϽº¸¦ ÇØÁ¦ ÇØÁØ´Ù.
4. C++ ·ç¾Æ ÇÔ¼ö È£Ãâ
¿¹Á¦¿¡¼ »ç¿ëÇÒ func.lua ÆÄÀÏÀÌ´Ù.
-- func.lua
g_nStep = 11
function luaAdd( num1, num2 )
return num1 + num2
end
function luaSub( num1, num2 )
return num1 - num2
end
function luaSum( num1, num2, num3 )
return DoSum( num1, num2, num3 )
end
|
ÀÌ ·ç¾Æ ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ¿Ã¸®·Á¸é luaL_dofile ¸í·ÉÀ» »ç¿ë ÇÑ´Ù.
//·ç¾Æ ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ¿Ã¸°´Ù.
int res = luaL_dofile( L, "func.lua" );
|
load_dofile()Àº ½ÇÇàÇÒ ·ç¾Æ ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ÀûÀç ÇÑ´Ù.
//func.lua¿¡¼ luaSub() ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù.
lua_getglobal( L, "luaSub" );
lua_pushnumber( L, 30 );
lua_pushnumber( L, 100 );
lua_call( L, 2, 1 );
int num = lua_tointeger( L, lua_gettop(L) );
|
lua_pushnumber¸¦ ÅëÇØ ·ç¾Æ ÇÔ¼ö¿¡¼ ¹ÞÀ» ÀÎÀÚ¸¦ 2°³¸¦ ³Ö´Â´Ù. lua_call()ÀÇ µÎ ¹ø° ÀÎÀڴ ȣÃ⠵Ǵ ·ç¾ÆÀÇ ÀÎÀÚ°¡ 2°³ ÀÎ °ÍÀ» ³ªÅ¸³»¸ç, ¼¼ ¹ø° ÀÎÀÚ´Â ·ç¾Æ¿¡¼ ¸®ÅÏÇÏ´Â ÀÎÀÚÀÇ °¹¼ö¸¦ ³ªÅ¸³½´Ù.
lua_tointeger()´Â ½ºÅÃ(·ç¾Æ ÇÔ¼ö¿¡¼ ¸®ÅÏÇÏ´Â)¿¡ ÀÖ´Â °ªÀ» Á¤¼ö·Î º¯È¯ÇÑ´Ù.
5. ·ç¾Æ¿¡¼ C++ È£Ãâ
//·ç¾Æ¿¡¼ C++ ÇÔ¼ö¸¦ È£ÃßÇϱâ À§Çؼ´Â ¹Ì¸® ÇÔ¼öµéÀ» µî·ÏÇØ¾ß ÇÑ´Ù.
lua_register(L, "DoSum", DoSum );
|
func.luaÀÇ luaSum()¿¡¼ C++ÀÇ DoSum()À» È£ÃâÇÑ´Ù. ·ç¾Æ¿¡¼ C++ ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§Çؼ´Â lua+register()¸¦ ÀÌ¿ëÇÏ¿© C++ ÇÔ¼ö¸¦ ¹Ì¸® µî·ÏÇÏ¿©¾ß ÇÑ´Ù. ¿©±â¼´Â DoSum()À̶ó´Â ÇÔ¼ö¸¦ µî·ÏÇÏ°í ÀÖ´Ù.
¾Æ·¡´Â ·ç¾Æ ÇÔ¼ö "luaSum"À» È£ÃâÇؼ ¸®ÅÏ°ªÀ» nSum¿¡ ³Ö°í ÀÖ´Ù.
#if 0
int DoSum(lua_State* L)
{
int n = lua_gettop(L); //ÀÎÀÚÀÇ °¹¼ö
lua_Integer sum = 0;
sum += lua_tointeger(L, 1);
sum += lua_tointeger(L, 2);
sum += lua_tointeger(L, 3);
lua_pushnumber(L, sum);
return 1; //¹Ýȯ°ªÀÌ 1°³ÀÌ´Ù.
}
#else
int DoSum(lua_State* L)
{
int n = lua_gettop(L); //ÀÎÀÚÀÇ °¹¼ö
lua_Integer sum = 0;
for (int i = 1; i <= n; i++)
{
if (!lua_isnumber(L, i))
{
lua_pushstring(L, "incorrect argument to function `average'");
lua_error(L);
}
sum += lua_tointeger(L, i);
}
lua_pushnumber(L, sum);
return 1; //¹Ýȯ°ªÀÌ 1°³ÀÌ´Ù.
}
#endif
|
·ç¾Æ¿¡¼ C++À» È£ÃâÇÒ ¶§ C++¿¡¼ ½ºÅÿ¡ °ªÀ» ÀÌ¿ëÇÒ ¶§´Â ·ç¾Æ »óÅ º¯¼ö°¡ Àֱ⠶§¹®¿¡ lua_tointeger(L, 1)ó·³ 1´Ü°èºÎÅÍ °ªÀ» ÀÐ¾î¼ »ç¿ëÇÑ´Ù. ¸®ÅÏ°ªÀÌ 1ÀÌ¸é ¹Ýȯ°ªÀÌ 1°³ÀÌ´Ù.
6. ·ç¾ÆÀÇ º¯¼ö °ª ÀÐ¾î ¿À±â
//·ç¾Æ º¯¼ö°ªÀ» ÀÐ¾î ¿Â´Ù.
lua_pushstring(L, "g_nStep");
lua_rawget(L, LUA_GLOBALSINDEX);
int nLuaStep = lua_tointeger( L, lua_gettop(L) );
|
lua_pushstring(), lua_rawget(), LUA_GLOBALSINDEX¸¦ ÀÌ¿ëÇϸé Àü¿ªº¯¼öÀÇ °ªÀ» ÀÐ¾î ¿Â´Ù. ÇÔ¼ö ó·³ lua_tointeger()¸¦ ÅëÇؼ °ªÀ» ÀÐ¾î ¿Â´Ù.
|