Page 4 of 7

Re: Порт LUA

Posted: Mon Mar 14, 2011 12:13 pm
by SoUrcerer
Пользуйтесь на здоровье ;)
lua52-lib.7z (92.6 KiB)
Downloaded 397 times
Новые функции:
systime()
sysdate() --возвращают дату и время в формате системных функций (т.е. это шестандцатерично-десятичные числа). Надеюсь, в будущем эти функции будут заменены на более цивилизованные функции libc
drawpixel(x,y,c) --поставить точку в окне
drawline(x,y,x1,y1,c) --нарисовать линию

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

Re: Порт LUA

Posted: Mon Mar 14, 2011 2:19 pm
by kogemyaka
Спасибо. Лично мне пока хватит. Напишу пару полезных программ и выложу.

Re: Порт LUA

Posted: Sat Mar 19, 2011 5:55 pm
by kogemyaka
Пример 1.lua в самой новой версии Lua не работает.

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

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

Code: Select all


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

Posted: Sat Mar 19, 2011 6:20 pm
by SoUrcerer
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: Select all


    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 

Re: Порт LUA

Posted: Sat Mar 19, 2011 6:30 pm
by SoUrcerer
Пример 1.lua должен выглядеть так:

Code: Select all

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

Posted: Tue Mar 22, 2011 9:39 pm
by kogemyaka
Кстати новый пример 1.lua не запускается, на доске отладки говориться что-то про символ "#".

Re: Порт LUA

Posted: Tue Mar 22, 2011 10:40 pm
by SoUrcerer
ЧЯДНТ?
У меня Lua 5.2, делаю Ctrl+C, открываю gedit, Ctrl+V, сохраняю, копирую в образ с помощью mcopy. Все работает.

Re: Порт LUA

Posted: Sat Mar 26, 2011 9:38 pm
by kogemyaka
Вот скрин.

Re: Порт LUA

Posted: Sat Mar 26, 2011 10:02 pm
by SoUrcerer
Что-то я не пойму. В качестве 1.lua нужно использовать тот код, который я выложил в предыдущем сообщении.
Lua ругается на символ # в строке 42.

Code: Select all

  if event==2 then
   --нажата кнопка на клавиатуре
      key=getkey()
      --ну и хрен с ней
   end
   if event==3 then button=getbutton()
   --нажата кнопка на экране
Никаких # в этом фрагменте кода нет и в помине. Если используется именно последняя версия lua и последняя версия 1.lua,то возможно, какие-то проблемы с файловой системой. Попробуй скопировать файл на rd и запустить оттуда.

Re: Порт LUA

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

Re: Порт LUA

Posted: Mon May 09, 2011 10:51 am
by Eruman
2Sorcerer: Есть у Lua возможность работы с портами? Нужны LPT и СОМ.

Re: Порт LUA

Posted: Mon May 09, 2011 2:13 pm
by Eruman
Для новичков:
Чтобы увидеть результаты работы оператора print () , запустите Board (Доску Отладки и сообщений) и тюкните по кнопке (Kern), чтобы переключить её на (User)

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

Code: Select all

    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: Select all

    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

Posted: Mon May 09, 2011 8:14 pm
by SoUrcerer
На доске отладки в режиме kern появляется ошибка с информацией о падении программы?Поздравляю,если так.У вас старое ядро,обновитесь до последней ночной сборки.Если пользуетесь kolibri in win,то у вас лишь один выход-использовать настоящую систему.

Re: Порт LUA

Posted: Mon May 09, 2011 8:37 pm
by Albom
Было бы здорово иметь возможность использовать функции из динамических библиотек...

Re: Порт LUA

Posted: Mon May 09, 2011 9:33 pm
by SoUrcerer
Я об этом уже думал. Много думал. И мало что придумал.
Самый простой вариант - добавить обертки к существующим библиотекам в виде обычных функций, и загружать библиотеки по вызову специальной команды. Т.е. нечто вроде

Code: Select all

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

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