Порт LUA (5.2.0)

...
  • Спасибо. Лично мне пока хватит. Напишу пару полезных программ и выложу.
  • Пример 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 
  • 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 
    
    Last edited by SoUrcerer on Sat Mar 19, 2011 6:31 pm, edited 1 time in total.
  • Пример 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
    
    
  • Кстати новый пример 1.lua не запускается, на доске отладки говориться что-то про символ "#".
  • ЧЯДНТ?
    У меня Lua 5.2, делаю Ctrl+C, открываю gedit, Ctrl+V, сохраняю, копирую в образ с помощью mcopy. Все работает.
  • Вот скрин.
    Attachments
    21.jpg
    21.jpg (70.43 KiB)
    Viewed 10044 times
  • Что-то я не пойму. В качестве 1.lua нужно использовать тот код, который я выложил в предыдущем сообщении.
    Lua ругается на символ # в строке 42.

    Code: Select all

      if event==2 then
       --нажата кнопка на клавиатуре
          key=getkey()
          --ну и хрен с ней
       end
       if event==3 then button=getbutton()
       --нажата кнопка на экране
    Никаких # в этом фрагменте кода нет и в помине. Если используется именно последняя версия lua и последняя версия 1.lua,то возможно, какие-то проблемы с файловой системой. Попробуй скопировать файл на rd и запустить оттуда.
  • Хотел предложить портировать на Колибри TinyBasic (есть исходники на Си), но почитал про Луну, передумал. ;) Вот интересный материал http://www.gamedev.ru/code/articles/Lua
    Соединяй, и здравствуй.
  • 2Sorcerer: Есть у Lua возможность работы с портами? Нужны LPT и СОМ.
    Соединяй, и здравствуй.
  • Для новичков:
    Чтобы увидеть результаты работы оператора 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
    Прога вылетает без сообщений об ошибке на доске. Так и должно быть?
    Соединяй, и здравствуй.
  • На доске отладки в режиме kern появляется ошибка с информацией о падении программы?Поздравляю,если так.У вас старое ядро,обновитесь до последней ночной сборки.Если пользуетесь kolibri in win,то у вас лишь один выход-использовать настоящую систему.
  • Было бы здорово иметь возможность использовать функции из динамических библиотек...
  • Я об этом уже думал. Много думал. И мало что придумал.
    Самый простой вариант - добавить обертки к существующим библиотекам в виде обычных функций, и загружать библиотеки по вызову специальной команды. Т.е. нечто вроде

    Code: Select all

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

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

    Users browsing this forum: No registered users and 3 guests