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

Вывод на экран из таблицы

Вопрос

Это мои первые попытки работы с таблицами. Извините, если это ну очень нубская ошибка.

Это продолжение вчерашнего вопроса - вывод на экран символов кодировки

 

Приведенный ниже код должен выводить квадрат из символов "#" со сторонами в 3 символа. 

Но печатает на экран 4 символа "#"в подряд. Так не должно быть.

local term = require("term")
local wX, wY, draw, wXst = 5, 5, {" ", "#", "*", "█", "▀", "▄", "▗"}, 0
local t = {2,2,2,9,2,1,2,9,2,2,2} -- 9- перевод строки

term.clear()
wXst=wX
term.setCursor(wX, wY)

for k, v in pairs(t) do 
  if v==9 then
    wY=wY+1; wX=wXst
  else
    term.write(draw[v])
    wX=wX+1
    term.setCursor(wX, wY)
  end
end

post-15506-0-93798800-1479801377_thumb.png

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

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


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

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

  • 0

Не вчитывался в код, но мне кажется это из-за того, что ты сначала рисуешь символ, а потом перемещаешь курсор.

Т.е. после перевода строки, первый символ окажется не там где надо, т.к. позиция курсора ещё не обновилась.

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


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

Мне кажется, проблема в том, как ты используешь пронумерованный массив.

Если он пронумерованный как у тебя, то лучше использовать цикл

for v=1, #t do -- проходим от 1 ячейки по последнюю в таблице t
  if v==9 then
    wY=wY+1; wX=wXst
  else
    term.write(draw[v])
    wX=wX+1
    term.setCursor(wX, wY)
  end
end

Твой же цикл:

for k, v in pairs(t) do 

Предназначен для непронумерованных таблиц вроде:

tb={
  name = "qwerty",
  v = 123,
  n = true
}

И такой цикл выводит элементы таблицы не по порядку. (так как он считает, что нет никакого порядка в таблице)

Вот у тебя и команды и выполнялись не по порядку. Если посчитаешь, то все пробелы, символы # и переносы строк у тебя выполняются в таком же количестве, но не по порядку, что подтвердить мои предположения.

 

P.S. Кстати да, Totoro прав. Когда ты делаешь перенос строки, то изменения не вступают в силу, так как не производится команда:

term.setCursor(wX, wY)

перед тем как напечатать символ.

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

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


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

@qwertyMAN, нет, не из-за этого.

Боб инициализирует массив не указывая ключи, а значит, Луа им сам выставляет ключи от 1 до N.

А цикл for k, v in pairs(t) do пройдёт по ним по порядку.

 

Но ты прав в том, что по индексированному массиву стоит перемещаться юзая индексы. =)

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

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


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

Не вчитывался в код, но мне кажется это из-за того, что ты сначала рисуешь символ, а потом перемещаешь курсор.

Т.е. после перевода строки, первый символ окажется не там где надо, т.к. позиция курсора ещё не обновилась.

Большое спасибо!!

 

Вставил строчку - заработало!

Сначала я подумал, что дело где-то в таблице

for k, v in pairs(t) do 
  if v==9 then
    wY=wY+1; wX=wXst
    term.setCursor(wX, wY) -- установка новой позиции курсора!
  else
    term.write(draw[v])
    wX=wX+1
    term.setCursor(wX, wY)
  end
end

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Но ты прав в том, что по индексированному массиву стоит перемещаться юзая индексы. =)

Насколько знаю, такие таблицы/циклы быстрее работают. Так что

for k, v in pairs(t) do  

в коде надо исправлять.

 

К тому же, когда будешь использовать циклы, где нужно внутри цикла что-то удалить. Без пронумерованного цикла не обойтись, там нужно будет идти с конца в начало, дабы не словить ошибку, перейдя на номер ячейки которая удалена.

local tb={}
for i=#tb, 1, -1 do
  ...
end

Так что Боб, привыкай к пронумерованным циклам тоже.

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

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


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

Вообще, как только возникает место, где копипастится дважды один и тот же кусок кода, стоит сразу задуматься - "а правильно ли я делаю?" =)

 

Например тут можно переписать код так:

for i = 1, #t do 
  if t[i] == 9 then
    wX = wXst
    wY = wY + 1
  else
    term.setCursor(wX, wY)
    term.write(draw[t[i]])
    wX = wX + 1
  end
end

P.S. К слову, для переноса строки лучше юзать число 0.

На случай, если у тебя будет бульше восьми символов для рисования.

А вот 0 никак не будет конфликтовать, т.к. индексы начинаются с 1.

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

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


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

Вообще, как только возникает место, где копипастится дважды один и тот же кусок кода, стоит сразу задуматься - "а правильно ли я делаю?" =)

 

Например тут можно переписать код так:

for i = 1, #t do 
  if t[i] == 9 then
    wX = wXst
    wY = wY + 1
  else
    term.setCursor(wX, wY)
    term.write(draw[t[i]])
    wX = wX + 1
  end
end

P.S. К слову, для переноса строки лучше юзать число 0.

На случай, если у тебя будет бульше восьми символов для рисования.

А вот 0 никак не будет конфликтовать, т.к. индексы начинаются с 1.

Спасибо за дополнения!

 

Про "0" - это  я не подумал :))))) - хорошая идея!

Но символов может быть и больше, если ввести в таблицу двухзначные числа.

 

  qwertyMAN, я с таблицами до этого еще не сталкивался. Для данной задачи удалять из таблицы нет необходимости. Но, возможно, это мне пригодится в будущем. 

Я правильно понял, что перебор таблицы через    

for i = 1, #t do

работает быстрее?

 

 

Спасибо!

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


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

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

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

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

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

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

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

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

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


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