quinta-feira, 13 de agosto de 2009

Carregando variáves de arquivo LUA

Olá, depois de um tempo sem postar nada, trago um exemplo de como se carregar variáveis de um arquivo lua para o seu aplicativo em c++, utilizando Dev-C++.

A linguagem lua vem sendo utilizada em muitos jogos, um grande exemplo é o jogo online Tibia, não é grande a atuação da linguagem lua neste jogo, ela é utilizada para se carregar variáveis como SERVIDOR, USUARIO, VERSÃO, entre outros detalhes.

Então vamos lá. Primeiramente temos que entender que a biblioteca que utilizaremos para carregar arquivos lua foi inicialmente desenvolvida para C, portanto, se você pretende utilizar C++ é necessário um comando para que seja possivel utilizar.

externn "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

Agora vamos ao nosso arquivo lua que guardará as variáveis. Crie um arquivo com a extenção lua e grave as seguintes vareiáveis:

SERVIDOR = "localhost"
USUARIO = "ROOT"
SENHA = "123"


Salve-o com o nome que desejar, desde que esteja na mesma pasta que o seu projeto. Para que o nosso programa possa ler as variáveis quando quiser, sem necessitar de um código enorme toda a vez que for capturar a variável, vamos criar uma função CarregaVariavel do tipo Const Char*. Esta função recebera o seguinte parâmetro:
variavel é a variavel que será carregada.
const char* CarregaVariavel(char* variavel)
{
// Variavel
lua_State *LuaVar = lua_open();
// Carrega o arquivo
int sts = luaL_loadfile(LuaVar, "hello.lua");

// Se carregou o arquivo
if( sts== 0 ) {
// Carrega os dados do arquivo em si...
sts = lua_pcall(LuaVar, 0, LUA_MULTRET,0);
}

// Captura o valor da variavel entre aspas.
lua_getglobal(LuaVar,variavel);
// Atribui a uma variavel o valor capturado
return lua_tostring(LuaVar,-1);

lua_close(LuaVar);
}

Para chamarmos a nossa função, declararemos uma variavel do tipo const char e chamamos a nossa função. como abaixo
const char *teste;
teste = CarregaVariavel(
"SERVIDOR");

O nosso programa final pode ser visto na listagem abaixo.

const char* CarregaVariavel(char* variavel);

int main( int argc, char ** argv) {

const char *servidor;
const char *usuario;
const char *senha;

servidor = CarregaVariavel( "SERVIDOR" );
cout << servidor << endl;
usuario = CarregaVariavel("USUARIO");
cout << usuario << endl;

senha = CarregaVariavel("SENHA");
cout << senha << endl;
system("pause");
return 0;
}

const char* CarregaVariavel(char* variavel)
{
// Variavel
lua_State *LuaVar = lua_open();
// Carrega o arquivo
int sts = luaL_loadfile(LuaVar, "hello.lua");

// Se carregou o arquivo
if( sts== 0 ) {
// Carrega os dados do arquivo em si...
sts = lua_pcall(LuaVar, 0, LUA_MULTRET,0);
}

// Captura o valor da variavel entre aspas.
lua_getglobal(LuaVar,variavel);
// Atribui a uma variavel o valor capturado
return lua_tostring(LuaVar,-1);

lua_close(LuaVar);
}

"Mas pô sipmann.. deu erro na hora de compila aqui no dev...??"... Para poder compilar é necessário baixar o pacote (através do sistema de pacotes do dev mesmo) "lua"... "Prontooo... e agora???"... Agora é necessário dizer ao compilador que iremos utilizar a biblioteca que acabamos de baixar (lembram do acesso ao mysql??? mesma coisa) Project >> Project Options >> Parameters... ai na lista "Linker" adicionem as duas linhas a seguir...
-lLua -lLualib

Pronto... só compilar e brincar...
Abração e espero que tenham gostado... qualquer duvida só posta ai... até

8 comentários:

  1. Maurício,
    Estou começando a estudar lua. Tentei compilar pelo Dev-C++ mas ele não está reconhecendo os comando em lua.
    Inclui os lua.h na pasta C:\Dev-Cpp\include.
    Fiz o seguinte programa:
    extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    #include "luaconf.h"
    }
    int main(void)
    {
    print("hello world");
    return 0;
    }
    Mas o comando print não é reconhecido

    ResponderExcluir
  2. Bom Dia Leonardo,

    a parte em Lua esta OK, mas em C++ para se "imprimir" algo na tela utiliza-se printf("TEXTO") ou cout << "TEXT << endl

    ok?? Qualquer dúvida estou a disposição.
    Abraços

    ResponderExcluir
  3. Ah bom! Com printf eu consegui. Mas como a apostila lua informa o comando print, eu pensei que o print fosse um comando da linguagem lua, e printf do C++.
    Cara, valeu pela dica e pela rapidez!! hehe.
    Provavelmente voltarei com mais perguntas a respeito!
    Flw

    ResponderExcluir
  4. Maurício,
    Tentei compilar o seu programa (acima) e o compilador acusou os seguintes erros:
    18 `cout' undeclared (first use this function)
    (Each undeclared identifier is reported only once for each function it appears in.)
    18 `endl' undeclared (first use this function)
    26 `system' undeclared (first use this function)
    33 `lua_open' undeclared (first use this function)

    ResponderExcluir
  5. Boa Tarde,
    o problema com o cout e o endl é simplesmente adicionar a biblioteca iostream.h

    #include

    o problema com o lua_open... Você esta colocando os includes corretos??
    Qual a versão das bibliotecas do Lua que você esta usando???
    Você colocou os parâmetros no "Linker" do Dev-C++??

    Acabei de testar o código e a princípio esta funcionando... Qualquer coisa lhe passo por e-mail os arquivos todos...

    Abraço

    ResponderExcluir
  6. cout e endl resolvido com a inclusão do #include

    Estou usando lua-5.2.0-beta
    Coloquei os parâmetros no linker.
    Me envia os arquivos por e-mail, por favor: leonardoja@ig.com.br
    Estou colocando os includes da seguinte forma:
    extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    #include "luaconf.h"
    }

    ResponderExcluir
  7. Boa noite Maurício C. Sipmann.
    Bom é o seguinte, a minha duvida esta relaciona com o seguinte.O código que vc fez acima após o script lua ser criado, todo esse código vai no script ou numa arquivo .cpp ou c.
    e que tentei colocar num arquivo .cpp só que reparei que os métodos não tem return.
    Eu programo a 12 anos em java mas em C/C++ e lua estou aprendendo agora.

    Dês de já Agradeço sua Atenção.
    Att:
    Wiliam Moscon

    ResponderExcluir
  8. Opa... boa noite... Não sei se entendi a sua "separação" dos códigos... Mas seguinte, ali onde fala "O nosso programa final pode ser visto na listagem abaixo." Dali até o próximo texto é código c/c++.

    a única coisa que esta escrito em lua é:

    SERVIDOR = "localhost"
    USUARIO = "ROOT"
    SENHA = "123"

    Espero ter esclarecido.

    Att

    ResponderExcluir