28 views
Skip to first unread message

Augusto Rodrigues

unread,
Apr 4, 2025, 10:44:00 PM4/4/25
to lua...@googlegroups.com
Caros(as),

Imagine que tem uma aplicação em C que contém as seguintes declarações de tipos:

typedef struct {
char field_1;
/* N declarações de campos aqui */
int field_N;
} STRUCT_1;

/* Aqui várias declarações de estruturas de dados - STRUCT_2, ...., STRUCT_N-1*/

typedef struct {
char field_1;
/* N declarações de campos aqui */
int field_N;
} STRUCT_N;

Baseado nos tipos declarados acima, é construída o seguinte tipo de dado:
typedef struct {
STRUCT_1 struct_1;
/ N declarações de campos do tipo struct */
STRUCT_N struct_N;
} BIG_STRUCT;

A aplicação preenche todos os campos de uma variavel do tipo BIG_STRUCT e, se usar a maneira convencional de transformar estruturas em C em tabelas Lua, serei obrigado usar um lua_push* e um lua_setfield para campo da variável do tipo BIG_STRUCT.

Gostaria de saber se existe um outro jeito de transformar a variavel do tipo  BIG_STRUCT em C em tabelas Lua que serão processadas pelos scripts Lua.

Pesquisei sobre algumas alternativas:
- Usar o LuaJit com FFI: Entendi que o ffi.cdef consegue criar uma tabela a partir de um trecho de código em C através do uso de ffi.cdef e ffi.new

Consigo repassar o conteúdo da variável do tipo BIG_STRUCT para o Lua via lua_pushlstring. Mas no lado do script Lua não consigo visualizar uma forma de repassar esse stream de bytes para o objeto criado pela função ffi.new.

Seria possível fazer isso? Se sim, como ? Tem alguma função da biblioteca FFI que permita isso?

-Usar o pack e unpack: Mas aqui eu precisaria montar setters e getters para cada campo que compõe a estrutura BIG_STRUCT :-(

-Outra sugestão... qual?

Se alguem souber de um tutorial com exemplos em ingles sobre o uso do FFI tambem ajudaria muito. 

Atenciosamente
Augusto de Miranda Rodrigues

Denis Dos Santos Silva

unread,
Jan 10, 2026, 5:38:31 PM (6 days ago) Jan 10
to Lua BR
opa,

pela data voce ja deve ter resolvido o problema, mas, como acabei vendo hoje resolvi fazer uma eventual solucao, bem mais simples do que usasr FFI.

get1: permite voce acessar um elemento da big struct
get2: gera uma tabela com elementos fixos
get3: gera uma tabela com elementos dinamicos

exemplo:
https://pastebin.com/NK0tfHPD

note:
- considerei um tipo unico estrutura
- as vezes o jeito mais 'facil' seria mapear e entao serializar a big no formato json
- outra forma que poderia ser feito seria metatables
-
typedef struct person_t { int id; char name[128]; int status; } person_t __attribute__((__aligned__(8)));
typedef struct contact_t {
/* note: why not? double linked list, array, ... */
person_t *person1,
*person51,
*person99;
// person_t **persons;
} contact_t __attribute__((__aligned__(8)));







Arion Deno

unread,
Jan 10, 2026, 7:10:47 PM (6 days ago) Jan 10
to lua...@googlegroups.com
Olá pessoal aínda não consegui resolver esse problema 😔.     Estou tentando cada uma das soluções sugeridas.      

Em breve eu passo mais detalhes.      Eu sou iniciante nessa parte.   Então estou fazendo um passo por vez.     

Estou testando o Open resty.      Obrigado muito a todos por me ajudar.   Logo logo trago notícias 

--
Lua BR - https://groups.google.com/g/lua-br
---
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para ver esta conversa, acesse https://groups.google.com/d/msgid/lua-br/e758a98a-237a-4861-939f-8b67fae5b89fn%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages