Ir ao conteúdo

Posts recomendados

Postado

Eu preciso fazer um programa que irá lidar com dados binários, muitos deles.

 

Resumindo, o programa C++ carregará um arquivo binário (alguns deles excedem 20mb) em um buffer. Em seguida, ele executará um script Lua e passará todos esses dados carregados para o script, que fará alguma manipulação e retornará o resultado para o programa C++.

 

Eu preciso fazer isso ter o melhor desempenho possível e fazer o trabalho mais rápido.

 

Um tempo atrás eu já fiz esse programa usando os métodos convencionais de Lua, mas era extremamente lento. Então, perdi os arquivos e agora quero refazê-lo de uma maneira melhor e mais rápida que não comprometa o desempenho.

 

Pesquisando um pouco, encontrei isso. Tive que fazer algumas pequenas mudanças para me adaptar à nova versão do Lua, mas não consigo fazer funcionar. Vocês podem me ajudar com isso?

 

E se há uma maneira melhor de fazer o trabalho que eu disse, qual seria?

 

#include "stdafx.h"

// metatable method for handling "array[index]"
static int array_index(lua_State* L) {
    int** parray = (int**)luaL_checkudata(L, 1, "array");
    int index = luaL_checkinteger(L, 2);
    lua_pushnumber(L, (*parray)[index - 1]);
    return 1;
}

// metatable method for handle "array[index] = value"
static int array_newindex(lua_State* L) {
    int** parray = (int**)luaL_checkudata(L, 1, "array");
    int index = luaL_checkinteger(L, 2);

    int value = luaL_checkinteger(L, 3);
    (*parray)[index - 1] = value;
    return 0;
}

// create a metatable for our array type
static void create_array_type(lua_State* L) {
    static const struct luaL_Reg array[] = {
       { "__index",  array_index  },
       { "__newindex",  array_newindex  },
       NULL, NULL
    };
    luaL_newmetatable(L, "array");

    luaL_setfuncs(L, array, 0);
}

// expose an array to lua, by storing it in a userdata with the array metatable
static int expose_array(lua_State* L, int array[]) {
    int** parray = (int**)lua_newuserdata(L, sizeof(int**));
    *parray = array;
    luaL_getmetatable(L, "array");
    lua_setmetatable(L, -2);
    return 1;
}

// test data
int mydata[] = { 1, 2, 3, 4 };

// test routine which exposes our test array to Lua 
static int getarray(lua_State* L) {
    return expose_array(L, mydata);
}

int __declspec(dllexport) __cdecl luaopen_array(lua_State* L) {
    create_array_type(L);

    // make our test routine available to Lua
    lua_register(L, "array", getarray);
    return 0;
}


int main()
{
    lua_State* L = luaL_newstate();
    luaL_dostring(L, "require 'array'");
    luaL_dostring(L, "foo = array()");
    luaL_dostring(L, "x = foo[1]");
    lua_getglobal(L, "x");
    lua_Number x = lua_tonumber(L, 1);

    printf("foo[1] = %d\n", (int)x);
}

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...