2015-11-01 2 views
1

Поддерживает ли lua какой-либо способ построения c-стиля?Массив структур в lua?

Я хочу, чтобы преобразовать что-то вроде следующих шрифтов растровых изображений из с:

struct charmatrix { char c; int line[5]; }; 
static charmatrix font[] = 
{ 
    "1", {0x2, 0x6, 0x2, 0x2, 0x2}, 
    "2", {0xe, 0x1, 0x6, 0x8, 0xf}, 

    "a" , {0x0, 0x5, 0xb, 0xb, 0x5} 

} 

font[letter].line[x] 

[править] добавил больше данных, чтобы показать не-числовых индексы

ответ

4

Сырой идеи структуры нет в Lua, но таблицы служат аналогичной цели.

Использование таблиц:

local font = { 
    ["1"] = {0x2, 0x6, 0x2, 0x2, 0x2}, 
    ["2"] = {0xe, 0x1, 0x6, 0x8, 0xf} 
} 

Это может быть доступ к font[letter][x] или font.letter[x]. Имейте в виду, что Lua массивы не нулевой индекс, поэтому х начинается с 1.

Если вам нужно немного больше структура, то вы можете использовать функцию для построения таблицы:

local function charmatrix(c, l1, l2, l3, l4, l5) 
    return {[c] = { l1, l2, l3, l4, l5 }} 
end 

local font = { 
    charmatrix("1", 0x2, 0x6, 0x2, 0x2, 0x2), 
    charmatrix("2", 0xe, 0x1, 0x6, 0x8, 0xf), 
} 

но это может быть излишним.

Edit: Если вы хотите сохранить line в коде можно построить таблицу следующим образом:

local font = { 
    ["1"] = { line = {0x2, 0x6, 0x2, 0x2, 0x2} }, 
    ["2"] = { line = {0xe, 0x1, 0x6, 0x8, 0xf} } 
} 

Accessed font[letter].line[x] или font.letter.line[x].
Обратите внимание, что ключи, которые являются строками, не нуждаются в котировках при определении, кроме числовых строк, поэтому line не окружен кавычками, где "1" и "2" есть. (Таким образом, вы можете получить доступ с кодом: font[letter]["line"][x])

+0

'' 1 "=' недействителен синтаксис lua. вам нужно будет поставить '[]' вокруг него. – daurnimator

+0

Я не уверен, почему вы цитируете '" 1 "и' "2" '. '[1] = ..., [2] = ...' будет более понятным. И на самом деле вам не нужно указывать индексы, просто напишите 'local font = {{0x2, 0x6, 0x2, 0x2, 0x2}, {0xe, 0x1, 0x6, 0x8, 0xf}}' –

+0

Обратите внимание, что 'font .letter' не будет работать здесь, поскольку 'letter' является' '1" 'или' "2" '. – hjpotter92

Смежные вопросы