Перейти к содержимому
  • 0
bob558

Таблица выдает ошибку

Вопрос

Написал программу  для голопроектора. Она должна выводить букву "п" 6х8 точек с вертикальной прорисовкой. Но программа даже не успевает очистить проэкцию и выдает ошибку. 

 

Вроде все сделал правильно, но ошибка -то есть!

 

local component = require("component")
local hologram = component.hologram

hologram.setPaletteColor(1, 0xFFFFFF) -- белый
hologram.setPaletteColor(0, 0x000000)

local alf = {}
alf[p]= {0, 0, 1, 1, 1, 1, 1, 0,
        0, 0, 1, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 0, 0, 0, 0,
        0, 0, 1, 1, 1, 1, 1, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0}   -- п


-- alf[101] = {00111110, 00101000, 00101000, 00010000, 00000000, 00000000} -- р


local function print_txt()
  local x = 5
  local z = 23
  for at=1, 48 do -- цикл отрисовки буквы
    local y = 30
    x = x + 1
    for ty=1, 8 do
      y = y-ty
      tt = alf[p][at]
      hologram.set(x, y, z, tt) -- отрисовка
    end
  end
end


----== Тело программы ==----


hologram.clear()


print_txt()

Сама ошибка: 

 

post-15506-0-60219300-1451467992_thumb.png

Изменено пользователем bob558

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

local component = require("component")
local hologram = component.hologram
 
hologram.setPaletteColor(2, 0xFFFFFF) -- белый 
hologram.setPaletteColor(1, 0x000000)
alf = {}
alf['p']= {1, 1, 2, 2, 2, 2, 2, 1,
        1, 1, 2, 1, 1, 1, 1, 1,
        1, 2, 1, 2, 1, 2, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1}   -- п
 
 
-- alf[101] = {00111110, 00101000, 00101000, 00010000, 00000000, 00000000} -- р
 
 
local function print_txt()
  local x = 5
  local z = 23
  for at=1, 48 do -- цикл отрисовки буквы
    local y = 30
    x = x + 1
    for ty=1, 8 do
      y = y-ty
      tt = alf['p'][at]
      hologram.set(x, y, z, tt) -- отрисовка
    end
  end
end
 
 
----== Тело программы ==----
 
 
hologram.clear()
 
 
print_txt()

Ошибку выдавал setPaletteColor(0, 0x000000), из за 0.

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не работает. Ошибка та же, и она  где-то глубже.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

  1. alf[p]= {0, 0, 1, 1, 1, 1, 1, 0,
  2. Переменная p не инициализированная, вот и ошибка потому как nil передается в index.

Или используй alf.p  что бы создать таблицу с ключём p.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То есть если я сделаю так:

local alf[p]= {0, 0, 1, 1, 1, 1, 1, 0,        0, 0, 1, 0, 0, 0, 0, 0,        0, 0, 1, 0, 0, 0, 0, 0,        0, 0, 1, 1, 1, 1, 1, 0,        0, 0, 0, 0, 0, 0, 0, 0,        0, 0, 0, 0, 0, 0, 0, 0}

то будет будет работать?

 

------

 

Не работает. Ругается на символ "["

 

 

post-15506-0-27089600-1451471233_thumb.png

Изменено пользователем bob558

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То есть если я сделаю так:

local alf[p]= {0, 0, 1, 1, 1, 1, 1, 0,        0, 0, 1, 0, 0, 0, 0, 0,        0, 0, 1, 0, 0, 0, 0, 0,        0, 0, 1, 1, 1, 1, 1, 0,        0, 0, 0, 0, 0, 0, 0, 0,        0, 0, 0, 0, 0, 0, 0, 0}

то будет будет работать?

 

------

 

Не работает. Ругается на символ "["

Блин, не alf[p], а alf["p"], кавычки, капитан, кавычки!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Блин, не alf[p], а alf["p"], кавычки, капитан, кавычки!!

 

Не работает!!!

 

Ошибка прежняя

Изменено пользователем bob558

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не работает!!!

 

Ошибка прежняя

local alf["p"] = {0, 0, 1, 1, 1, 1, 1, 0,        0, 0, 1, 0, 0, 0, 0, 0,        0, 0, 1, 0, 0, 0, 0, 0,        0, 0, 1, 1, 1, 1, 1, 0,        0, 0, 0, 0, 0, 0, 0, 0,        0, 0, 0, 0, 0, 0, 0, 0}?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Во первых alf[p] заменяем на alf["p"]

Во вторых tt = alf[p][at] замени на tt = alf["p"][at]

В третьих, на всякий случай, после того как указана переменная tt сразу же вставь это:

if tt == 1 then

  tt = true

elseif tt==0 then

  tt=false

else

  print("error")

end

Возможно hologram.set(x, y, z, tt) не примет обычные цифры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Во первых alf[p] заменяем на alf["p"]

Во вторых tt = alf[p][at] замени на tt = alf["p"][at]

 

 

Это я уже делал и программа так же выдавала ошибку.

 

Воспользовался советом Neo и заработало, правда не так, как хотелось.

post-15506-0-43374900-1451476518_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это я уже делал и программа так же выдавала ошибку.

 

Воспользовался советом Neo и заработало, правда не так, как хотелось.

У тебя какая то путаница с циклами.

А должен быть порядок:

 

Цикл с изменением x от 1 до 8

  В него вкладываешь цикл изменяющий y от 1 до 6

конец обоих циклов.

 

А цикл с at вообще не нужен.

 

Дело в том что двойной цикл и будет давать 6*8= 48 проходов.

Просто внутри обоих циклов пишем hologram.set(x, y, z, alf[x*y]) и никакого at не надо.

Ведь x*y - это и есть по сути эквивалент числа at.

Изменено пользователем qwertyMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
local function print_txt()
  local x = 5                   -- фиксирование начальных координат
  local z = 23


  for at=1, 48 do               -- цикл отрисовки буквы - 48 - кол-во символов в букве
    local y = 30                -- зафиксировать начальный уровень буквы по высоте
    x = x + 1                   -- сделать отступ в право для каждого вертикального слоя
    for ty=1, 8 do              -- цикл для прорисовки вертикального слоя буквы высотой в 8
      y = y-ty                  -- спуститься на 1 пиксель вниз
      tt = alf["p"][at]         --  получить значение 
      hologram.set(x, y, z, tt) -- отрисовка
    end
  end
end

С циклами, вроде я ни чего не напутал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
local function print_txt()
  local x = 5                   -- фиксирование начальных координат
  local z = 23


  for at=1, 48 do               -- цикл отрисовки буквы - 48 - кол-во символов в букве
    local y = 30                -- зафиксировать начальный уровень буквы по высоте
    x = x + 1                   -- сделать отступ в право для каждого вертикального слоя
    for ty=1, 8 do              -- цикл для прорисовки вертикального слоя буквы высотой в 8
      y = y-ty                  -- спуститься на 1 пиксель вниз
      tt = alf["p"][at]         --  получить значение 
      hologram.set(x, y, z, tt) -- отрисовка
    end
  end
end

С циклами, вроде я ни чего не напутал.

 

У тебя x 48 раз прибавляется. Хотя бы для приличия вот этот костыль поставил бы if x>6 then x=x-6 end

А то x уходит далеко-далеко.

 

А в лучшем случае надо бы переписать код на основе двух циклов x и y.

И читаемость кода будет лучше и производительность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У тебя x 48 раз прибавляется. Хотя бы для приличия вот этот костыль поставил бы if x>6 then x=x-6 end

А то x уходит далеко-далеко.

 

А в лучшем случае надо бы переписать код на основе двух циклов x и y.

И читаемость кода будет лучше и производительность.

 

Да, теперь вижу - спасибо огромное!!!!!!  Вечером поправлю код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
local function print_txt()

  local x = 5                   -- фиксирование начальных координат

  local y = 30

  local z = 23

 

 

  for tx=1, 6 do                         -- цикл перебора x

    for ty=1, 8 do                       -- цикл перебора y

      tt = alf["p"][ (tx-1)*8+ty ]     --  получить значение (где 8 - это максимум ty)

      hologram.set(x, y, z, tt)    -- отрисовка

      y = y-1                                -- спуститься на 1 пиксель вниз

    end

  x = x+1                                   -- передвинуться вправо на 1 пиксель

  end

end

 

P.S. Перевод ячейки сделан специально после отрисовки, чтобы начало отображение было с точно зафиксированных координат. (5,30,23). В твоей же программе отрисовка шла с координат (6,29,23)

Изменено пользователем qwertyMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
tt = alf["p"][ (tx-1)*8+ty ]

 

Этот код - это здорово и просто!!!!

 

Спасибо! 

Изменено пользователем bob558

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Этот код - это здорово и просто!!!!

 

Спасибо! 

Нет, ну конечно можно сделать первобытный таймер чтобы подсчитать количество циклов внутри двойного цикла:

 

local n=0

for ... for...

...

n=n+1

tt = alf["p"][ n ]

...

end ... end

 

Но кому это надо, если есть способ получше. (tx-1)*8+ty Вся красота математики в вполне логичной формуле :D

Если ты не понял, то в формуле высчитывается сколько циклов делает один цикл и прибавляется количество пройденных циклов от второго. Да-да, мы технари такие!

 

P.S. Чтобы максимально сжать прогу и улучшить её читаемость можно ещё объявить переменные так:

  local x, y, z = 5, 30, 23                  -- фиксирование начальных координат
Изменено пользователем qwertyMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...