LUA¿Í C++ ¿¬°á

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¿¡¼­ »ý¼ºµÈ ·ç¾Æ ÀνºÅϽº¸¦ ÇØÁ¦ ÇØÁØ´Ù.

	lua_close(L);

 

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()¸¦ ÅëÇؼ­ °ªÀ» ÀÐ¾î ¿Â´Ù.