Board.KolibriOS.org

Official KolibriOS board
It is currently Wed May 22, 2019 10:32 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 88 posts ]  Go to page Previous 1 2 3 4 5 6 Next
Author Message
 Post subject: Re: Порт LUA
PostPosted: Mon Mar 14, 2011 12:13 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Пользуйтесь на здоровье ;)
Attachment:
lua52-lib.7z [92.6 KiB]
Downloaded 149 times

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

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


Top
   
 Post subject: Re: Порт LUA
PostPosted: Mon Mar 14, 2011 2:19 pm 
Offline
User avatar

Joined: Sun May 10, 2009 7:56 pm
Posts: 98
Спасибо. Лично мне пока хватит. Напишу пару полезных программ и выложу.


Top
   
 Post subject: Re: Порт LUA
PostPosted: Sat Mar 19, 2011 5:55 pm 
Offline
User avatar

Joined: Sun May 10, 2009 7:56 pm
Posts: 98
Пример 1.lua в самой новой версии Lua не работает.

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

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

Code:

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


Top
   
 Post subject: Re: Порт LUA
PostPosted: Sat Mar 19, 2011 6:20 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 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, потому что это была просто маленькая демо-программа, но по-хорошему нужно перерисовывать лишь ту часть окна, где перерисовка требуется. Чтобы облегчить эту задачу, в ближайшее время я добавлю функцию рисования прямоугольника.

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

    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


Last edited by SoUrcerer on Sat Mar 19, 2011 6:31 pm, edited 1 time in total.

Top
   
 Post subject: Re: Порт LUA
PostPosted: Sat Mar 19, 2011 6:30 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Пример 1.lua должен выглядеть так:

Code:
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



Top
   
 Post subject: Re: Порт LUA
PostPosted: Tue Mar 22, 2011 9:39 pm 
Offline
User avatar

Joined: Sun May 10, 2009 7:56 pm
Posts: 98
Кстати новый пример 1.lua не запускается, на доске отладки говориться что-то про символ "#".


Top
   
 Post subject: Re: Порт LUA
PostPosted: Tue Mar 22, 2011 10:40 pm 
Offline

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


Top
   
 Post subject: Re: Порт LUA
PostPosted: Sat Mar 26, 2011 9:38 pm 
Offline
User avatar

Joined: Sun May 10, 2009 7:56 pm
Posts: 98
Вот скрин.


Attachments:
21.jpg
21.jpg [ 70.43 KiB | Viewed 2569 times ]
Top
   
 Post subject: Re: Порт LUA
PostPosted: Sat Mar 26, 2011 10:02 pm 
Offline

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


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


Top
   
 Post subject: Re: Порт LUA
PostPosted: Sun May 08, 2011 10:37 pm 
Offline

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

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


Top
   
 Post subject: Re: Порт LUA
PostPosted: Mon May 09, 2011 10:51 am 
Offline

Joined: Sun May 08, 2011 3:31 pm
Posts: 13
2Sorcerer: Есть у Lua возможность работы с портами? Нужны LPT и СОМ.

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


Top
   
 Post subject: Re: Порт LUA
PostPosted: Mon May 09, 2011 2:13 pm 
Offline

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

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

Code:
    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 стороки добавить любой код, генерит ошибку:
.....
Code:
    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
Прога вылетает без сообщений об ошибке на доске. Так и должно быть?

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


Top
   
 Post subject: Re: Порт LUA
PostPosted: Mon May 09, 2011 8:14 pm 
Offline

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


Top
   
 Post subject: Re: Порт LUA
PostPosted: Mon May 09, 2011 8:37 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 752
Было бы здорово иметь возможность использовать функции из динамических библиотек...


Top
   
 Post subject: Re: Порт LUA
PostPosted: Mon May 09, 2011 9:33 pm 
Offline

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


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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 88 posts ]  Go to page Previous 1 2 3 4 5 6 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited