2012-06-25 3 views
0

У меня проблема, которая, я полагаю, должна быть очень распространенной, и большинство из вас столкнулось бы с ней. Я написал программу в lua, скажем main.lua, которая при получении ключевого события должна изменить координаты и отобразить геометрическую фигуру. Этот код lua вызывает reg.c, где это вид регистров. Теперь в reg.c у меня есть механизм функций, который получает нажатую клавишу и передает ее функции lua, отвечающей за управление ключами. Но к моменту появления ключевого события код lua выполняется с регистрацией и завершением, поэтому вызов от engine() становится незаконным доступом к памяти, что приводит к ошибке сегментации.Поток управления в Lua

Кроме того, предположим, что мы не можем подключить lua в функции reg и вызвать функцию двигателя из другого места.

Тогда что должно быть решением, пожалуйста, помогите мне в этом.


@jacob: вот прообраз того, что я пытаюсь достичь:

function key_handler() //this function will get the latest key pressed from some other function 
{ 
    draw.image(); 
    draw.geometry(); 
    ... 
    ... 

    while(1) 
    { 
     //draw Points until some condition goes wrong  
    } 

} 

Теперь, когда вступил в key_handler, в то время как он занят рисование точек, если и до тех пор, пока происходит неуспешное условие , я не могу получить нажатие клавиши до этого времени.

Надеюсь, это объяснение намного проще и поставило мою точку зрения и поможет другим понять проблему. Мне очень жаль, но я не умею выражать или заставлять других понимать. более

Одна вещь, я ahve следовал синтаксису C, чтобы объяснить, однако это полностью реализован в Lua

+0

Трудно видеть вашу установку и то, что вы пытаетесь выполнить из своего вопроса (например, никто не знает, что делает или должен делать 'reg.c', то же самое для' engine() '). Пожалуйста, уточните и дайте минимальный образец кода, чтобы продемонстрировать, что не работает. – jpjacobs

+0

@jpjacobs: Я обновил проблему до лучших своих усилий, любезно посмотрю, можете ли вы порекомендовать мне какое-либо решение проблемы – ashutosh

+0

Я пробовал использовать сопрограммы, но это не помогло – ashutosh

ответ

0

Ваш фрагмент кода по-прежнему в значительной степени неинформативных (в идеале один должен быть в состоянии просто запустить свой код в Lua-интерпретатор и посмотреть вашу проблему). Если вы описываете проблему Lua, используйте Lua-код для ее описания.

Однако я начинаю видеть, куда вы хотите отправиться.

Что вам нужно сделать, это может иметь сопрограмму, который вызывается в вашей ключевой обработчик, который передает аргумент обратно в обработчик:

function isContinue() --just to simulate whatever function you use getting keypresses. 
-- in whatever framework you're using there will probably be a function key_pressed or the like. 
    print('Initialize checking function') 
    while true do 
     print('Continue looping?') 
     local ans = io.read():match('[yY]') 
     local action 
     if not ans then 
      print('Do what instead?') 
      action = io.read() 
      if action:match('kill') then -- abort keychecker. 
       break 
      end 
     end 
     coroutine.yield(ans,action) 
    end 
    print('finalizing isContinue') 
    return nil,'STOP' -- important to tell key_handler to quit too, else it'll be calling a dead coroutine. 
end 

function key_handler() 
    local coro = coroutine.create(isContinue) 
    local stat,cont,action 
    while true do 
     print'Draw point' 
     stat,cont,action = coroutine.resume(coro) 
     if not stat then 
      print('Coroutine errored:',cont) 
     elseif not cont then 
      print('isContinue interrupted keyhandler') 
      print("We'll "..action.." instead.") 
      break 
     end 
    end 
    print('finalizing key_handler') 
end 

key_handler() 
-- type something containing y or Y to continue, all else aborts. 
-- when aborting, you get asked what to do instead of continuing, 
--- with "kill" being a special case. 

Это должно быть само за себя. Вероятно, вы должны хорошо взглянуть на Programming in Lua, chapter 9: Coroutines.

Большая сложность (ну, если вы не привыкли к совместному потоку) заключается в том, что сопрограмма должна уступить себя: это не вызывающая функция, которая отвечает за возврат управления.

Надеюсь, это вам поможет.

Смежные вопросы