Перейти к содержимому
  • 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

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


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

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

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

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

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


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

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

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

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

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


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

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

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

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

 

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

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

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


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

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

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

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

 

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

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

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

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


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

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

for k, v in pairs(t) do  

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

 

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

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

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

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

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


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

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

 

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

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

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


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

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

 

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

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 эмодзи.

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

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

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


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