Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср сен 20, 2017 7:16 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 88 сообщений ]  На страницу Пред. 1 2 3 4 5 6 След.
Автор Сообщение
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Пн мар 14, 2011 12:13 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Пользуйтесь на здоровье ;)
Вложение:
lua52-lib.7z [92.6 КБ]
103 скачивания

Новые функции:
systime()
sysdate() --возвращают дату и время в формате системных функций (т.е. это шестандцатерично-десятичные числа). Надеюсь, в будущем эти функции будут заменены на более цивилизованные функции libc
drawpixel(x,y,c) --поставить точку в окне
drawline(x,y,x1,y1,c) --нарисовать линию

Что еще нужно?:)


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Пн мар 14, 2011 2:19 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 10, 2009 7:56 pm
Сообщения: 97
Спасибо. Лично мне пока хватит. Напишу пару полезных программ и выложу.


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Сб мар 19, 2011 5:55 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 10, 2009 7:56 pm
Сообщения: 97
Пример 1.lua в самой новой версии Lua не работает.

Не поможешь немного разобраться?

Программа по нажатиям кнопок корректно рисует таблицу умножения (DrawTable), а затем по кнопке должна проверять её (LineChekTable), но что-то не так, не запускается.

Код:

i=0 --for first myltiply
j=2 --for second multiply
sum=0
x=10 -- first x coordinate
y=30 -- first y coordinate
iy=12 --for next y coordinate
ix=7 -- x coordinate for each next symbol
iTemp=2; --for remember i
result=0; --for result human point in LineChekTable(0


function DrawTable()

for i=2,9,1 do
for j=2,9,1 do
   if iTemp<i then
      x=x+45
      if i<6 then y=30 end
      if i>=6 then y=130 end
   end
        if i==6 then x=10 end

   sum=i*j
   textout(x,y,0,i)
   textout(x+6,y,0,"*")
   textout(x+12,y,0,j)
   textout(x+18,y,0,"=")   
   textout(x+24,y,0,sum)
   y=y+iy
   iTemp=i      
end   
end       
 
end

function LineChekTable()
for i=2,9,1 do
for j=2,9,1 do
   if iTemp<i then
      x=x+45
      if i<6 then y=30 end
      if i>=6 then y=130 end
   end
   if i==6 then x=10 end
   sum=i*j
   textout(x,y,0,i)
   textout(x+6,y,0,"*")
   textout(x+12,y,0,j)
   textout(x+18,y,0,"=")
   event chekevent()
   if event==2 then key=getkey() end
   if key==sum then
      textout(x+24,y,0,sum)
      result=result+1
   end
   if key<>sum then textout(x+24,y,0,"?") end
   
   y=y+iy
   iTemp=i
end
end
end



function drawwin(press)
--here we draw window
redraw(1)
window(10,10,320,240,65069280,2147483903,0)
textout(3,3,0,"Hello world!")

makebutton(240,60,60,30,3,13619151)
textout(245,75,0,"Line test")

makebutton(240,30,60,30,2,13619151)
textout(245,45,0,"Remember")

if press==2 then DrawTable() end
if press==3 then LineChekTable()



redraw(2)
end

press=0
--main loop
while 1==1 do
   event=checkevent()
   if event==1 then drawwin(press) end
   if event==2 then key=getkey()
   drawwin(press) end
   if event==3 then button=getbutton()
      if button==1 then sysexit() end
      if button==2 then press=2 end
      if button==3 then press=3 end

      drawwin(press)
   end
end


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Сб мар 19, 2011 6:20 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
1) В lua5.2-lib следует вместо redraw(1) и redraw(2) использовать новые функции paintstart и paintend.

2) Если нет необходимости постоянно проверять события (то есть в основном цикле программа ничего не делает), лучше поставить waitevent вместо checkevent, это снизит нагрузку на процессор (хотя, как говорят умные люди, в этом ничего особенно плохого нет - при нормальном планировщике).

3) Что это за строчка -
event chekevent() ?
На нее lua ругается в первую очередь..
Может, event=checkevent() ? Даже если так, лучше использовать другой принцип построения программы. И жить станет лучше, жить станет веселее... За подробностями можно в ЛС ;)

4)Кстати, хинт: lua выводит сообщения об ошибках на доску отладки.

5) Вместо <> нужно использовать ~=. Выпендрились разработчики :D

6) В одной из функций потерялся end. (В drawwin после if press==3) Чтобы их не терять, советую использовать редактор с подсветкой синтаксиса, использовать табуляцию и всё такое.

7) После нажатия Remember получаю таблицу умножения, а после нажатия Line test она вся расползается, и непонятно, что нужно делать. При этом происходит постоянная перерисовка. Я ничего не делал для убирания её в calc, потому что это была просто маленькая демо-программа, но по-хорошему нужно перерисовывать лишь ту часть окна, где перерисовка требуется. Чтобы облегчить эту задачу, в ближайшее время я добавлю функцию рисования прямоугольника.

Немного исправленный код (в последней версии работает по крайней мере):
Код:

    i=0 --for first myltiply
    j=2 --for second multiply
    sum=0
    x=10 -- first x coordinate
    y=30 -- first y coordinate
    iy=12 --for next y coordinate
    ix=7 -- x coordinate for each next symbol
    iTemp=2; --for remember i
    result=0; --for result human point in LineChekTable(0


    function DrawTable()

    for i=2,9,1 do
    for j=2,9,1 do
       if iTemp<i then
          x=x+45
          if i<6 then y=30 end
          if i>=6 then y=130 end
       end
            if i==6 then x=10 end

       sum=i*j
       textout(x,y,0,i)
       textout(x+6,y,0,"*")
       textout(x+12,y,0,j)
       textout(x+18,y,0,"=")   
       textout(x+24,y,0,sum)
       y=y+iy
       iTemp=i     
    end   
    end       
     
    end

    function LineChekTable()
    for i=2,9,1 do
    for j=2,9,1 do
       if iTemp<i then
          x=x+45
          if i<6 then y=30 end
          if i>=6 then y=130 end
       end
       if i==6 then x=10 end
       sum=i*j
       textout(x,y,0,i)
       textout(x+6,y,0,"*")
       textout(x+12,y,0,j)
       textout(x+18,y,0,"=")
       event=checkevent()
       if event==2 then key=getkey() end
       if key==sum then
          textout(x+24,y,0,sum)
          result=result+1
       end
       if key~=sum then textout(x+24,y,0,"?") end
       
       y=y+iy
       iTemp=i
    end
    end
    end



    function drawwin(press)
    --here we draw window
    paintstart()
    window(10,10,320,240,65069280,2147483903,0)
    textout(3,3,0,"Hello world!")

    makebutton(240,60,60,30,3,13619151)
    textout(245,75,0,"Line test")

    makebutton(240,30,60,30,2,13619151)
    textout(245,45,0,"Remember")

    if press==2 then DrawTable() end
    if press==3 then LineChekTable() end



    paintend()
    end
   

    press=0
    --main loop
    while 1==1 do
       event=checkevent()
       if event==1 then drawwin(press) end
       if event==2 then key=getkey()
       drawwin(press) end
       if event==3 then button=getbutton()
          if button==1 then sysexit() end
          if button==2 then press=2 end
          if button==3 then press=3 end

          drawwin(press)
       end
    end


Последний раз редактировалось SoUrcerer Сб мар 19, 2011 6:31 pm, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Сб мар 19, 2011 6:30 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Пример 1.lua должен выглядеть так:

Код:
function drawwin(press) 
--рисуем окно
   paintstart()
   --начинаем рисовать.
        --раньше с этого места начиналась боль :D
   window(10,10,300,200,65069280,2147483903,0)
   --создаем окно
   textout(3,3,0,"Hello world!")
   --выводим текст

   if press==1 then
      --создаем кнопку первого цвета, если press==1
      makebutton(13,40,180,20,2,3619151)
      textout(16,43,0,"It was a button")
   end
   if press==0 then
      --создаем кнопку другого цвета, если press==0
      makebutton(13,40,180,20,2,13619151)
      textout(16,43,0,"This is a button")
   end
   paintend()
   --заканчиваем перерисовку
end

press=0
--константа перед главным циклом. неплохо было бы вынести их все в отдельный файл, но пока что это не поддерживается

drawwin(press)
--создадим окно
while 1==1 do
--и начинаем вечный цикл
   event=waitevent()
   --ждем события
   if event==1 then
   --нужна перерисовка
      drawwin(press)
   end
   if event==2 then
   --нажата кнопка на клавиатуре
      key=getkey()
      --ну и хрен с ней
   end
   if event==3 then button=getbutton()
   --нажата кнопка на экране
      if button==1 then sysexit() end
      --если у нее номер 1, то программе пора завершить свою работу
      if button==2 then
      --а если два, то сменим значение press.
         if press==1 then press=0 else press=1 end
         --Для этого можно было бы использовать логические операторы, но мы прикинемся ветошью и сделаем вид, что не знаем, как это делается
         drawwin(press)
         --нужно перерисовать окно, потому что цвет кнопки изменился
      end
   end
end



Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Вт мар 22, 2011 9:39 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 10, 2009 7:56 pm
Сообщения: 97
Кстати новый пример 1.lua не запускается, на доске отладки говориться что-то про символ "#".


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Вт мар 22, 2011 10:40 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
ЧЯДНТ?
У меня Lua 5.2, делаю Ctrl+C, открываю gedit, Ctrl+V, сохраняю, копирую в образ с помощью mcopy. Все работает.


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Сб мар 26, 2011 9:38 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 10, 2009 7:56 pm
Сообщения: 97
Вот скрин.


Вложения:
21.jpg
21.jpg [ 70.43 КБ | 1854 просмотра ]
Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Сб мар 26, 2011 10:02 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Что-то я не пойму. В качестве 1.lua нужно использовать тот код, который я выложил в предыдущем сообщении.
Lua ругается на символ # в строке 42.
Код:
  if event==2 then
   --нажата кнопка на клавиатуре
      key=getkey()
      --ну и хрен с ней
   end
   if event==3 then button=getbutton()
   --нажата кнопка на экране


Никаких # в этом фрагменте кода нет и в помине. Если используется именно последняя версия lua и последняя версия 1.lua,то возможно, какие-то проблемы с файловой системой. Попробуй скопировать файл на rd и запустить оттуда.


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Вс май 08, 2011 10:37 pm 
Не в сети

Зарегистрирован: Вс май 08, 2011 3:31 pm
Сообщения: 13
Хотел предложить портировать на Колибри TinyBasic (есть исходники на Си), но почитал про Луну, передумал. ;) Вот интересный материал http://www.gamedev.ru/code/articles/Lua

_________________
Соединяй, и здравствуй.


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Пн май 09, 2011 10:51 am 
Не в сети

Зарегистрирован: Вс май 08, 2011 3:31 pm
Сообщения: 13
2Sorcerer: Есть у Lua возможность работы с портами? Нужны LPT и СОМ.

_________________
Соединяй, и здравствуй.


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Пн май 09, 2011 2:13 pm 
Не в сети

Зарегистрирован: Вс май 08, 2011 3:31 pm
Сообщения: 13
Для новичков:
Чтобы увидеть результаты работы оператора print () , запустите Board (Доску Отладки и сообщений) и тюкните по кнопке (Kern), чтобы переключить её на (User)

к ТС:
Пока вопросы копятся. Запустил Lua, пример с таблицей вылетает с символом #, только номер строки другой. Стал исключать строки для поиска ошибки. Вот этот код ошибку не дает:

Код:
    i=0
    j=2
    sum=0
    x=10
    y=30
    iy=12
    ix=7
    iTemp=2
    result=0

    function DrawTable()
    for i=2,9,1 do
    for j=2,9,1 do
    print (i, x, iTemp)
      if iTemp<i then
     x=x+45
     if i<6 then y=30 end
     if i>=6 then y=130 end
       end
    end
    end
    end

    function drawwin(press)
    paintstart()
    window(10,10,320,240,65069280,2147483903,0)
    textout(3,3,0,"Hello world!")

    makebutton(240,60,60,30,3,13619151)
    textout(245,75,0,"Line test")

    makebutton(240,30,60,30,2,13619151)
    textout(245,45,0,"Remember")

    if press==2 then DrawTable() end
    if press==3 then LineChekTable() end

    paintend()
    end

    press=0

    while 1==1 do
       event=checkevent()
       if event==1 then drawwin(press) end
       if event==2 then key=getkey()
       drawwin(press) end
       if event==3 then button=getbutton()
     if button==1 then sysexit() end
     if button==2 then press=2 end
     if button==3 then press=3 end
     drawwin(press)
       end
    end


Но стоит после 19 стороки добавить любой код, генерит ошибку:
.....
Код:
    for i=2,9,1 do
    for j=2,9,1 do
    print (i, x, iTemp)
      if iTemp<i then
     x=x+45
     if i<6 then y=30 end
     if i>=6 then y=130 end
       end
    print (i, x, iTemp)
    end
    end

.....

Еще непонятно, скармливаю выражение :
i[1] = 1
Прога вылетает без сообщений об ошибке на доске. Так и должно быть?

_________________
Соединяй, и здравствуй.


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Пн май 09, 2011 8:14 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
На доске отладки в режиме kern появляется ошибка с информацией о падении программы?Поздравляю,если так.У вас старое ядро,обновитесь до последней ночной сборки.Если пользуетесь kolibri in win,то у вас лишь один выход-использовать настоящую систему.


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Пн май 09, 2011 8:37 pm 
Не в сети
Mentor
Аватара пользователя

Зарегистрирован: Вт янв 15, 2008 11:27 am
Сообщения: 750
Было бы здорово иметь возможность использовать функции из динамических библиотек...


Вернуться к началу
 Заголовок сообщения: Re: Порт LUA
СообщениеДобавлено: Пн май 09, 2011 9:33 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Я об этом уже думал. Много думал. И мало что придумал.
Самый простой вариант - добавить обертки к существующим библиотекам в виде обычных функций, и загружать библиотеки по вызову специальной команды. Т.е. нечто вроде
Код:
import(libini)
libini.open(x)


Я легко мог бы добавить функцию загрузки библиотеки, но что это даст? Нужно как-то импортировать функции, а как это сделать - я понятия не имею. Насколько я понимаю, в lua для этих целей обычно создаются обертки на смеси языков lua и Си - например, luaSDL или luasocket. Все равно уходим к первому варианту...

Если более гибкое решение есть - с радостью воплощу его.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 88 сообщений ]  На страницу Пред. 1 2 3 4 5 6 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB