| Author |
Message |
|
|
Mister_SER wrote:вообзето да, испошлбзуя метод z00n'а , прога падает 
Не верите мне - читайте PIL(http://www.lua.org/pil/24.2.3.html)
Roberto Ierusalimschy wrote:
The lua_gettop function returns the number of elements in the stack, which is also the index of the top element.
Notice that a negative index -x is equivalent to the positive index gettop - x + 1.
|
 |
|
|
Mister_SER wrote:
Я лично получаю так:
Ваша функция всегда возвращает 1 - вам оно надо?
|
 |
|
|
moteus wrote:
дело именно в том, как windows вызывает интерпретатор
Я тоже к этому склоняюсь
...
Похоже на то, что проблема действительно в windows. Нашел подтверждение в майл-листе питона.
http://mail.python.org/pipermail/python-list/2004-September/282301.html
moteus wrote:Забыл сказать что это Windows
У меня тоже, и под MSYS, и под Cygwin все ok
|
 |
|
|
Сделать скрипт исполнимым?
|
 |
|
|
zhengxi wrote:А можно посмотреть на "HyperLua compiler version 0.85 alpha", которым это сгенерено ?
Или хотя бы как на нём код выглядит
Код я прилагаю. Компилятор тоже не то чтобы секретный - к нему просто документация отсутствует вообще.
Если вам охота разбираться в нем методом проб и ошибок - могу его выложить тоже, с коротким readme.
Я про него немного писал на rsdn:
http://www.rsdn.ru/forum/message/2926090.1.aspx
http://www.rsdn.ru/forum/message/2927730.1.aspx
http://www.rsdn.ru/forum/message/2940029.1.aspx
|
 |
|
|
_Dmitriy_ wrote:
Что имелось ввиду под «или возобновляют корутину» ?
Когда ваш скрипт выполнен, вам нужно вернуться в главный цикл. Как?
Потоки и прочие формы параллельного выполнения не рассматриваются по
причине неадекватности.
1) Скрипт просто завершается - т.е. в следующем цикле его опять
считают с диска, откомпилируют и запустят с новыми данными. Как не
сранно это вполне работает. Для ускорения процесса скрипт можно
прекомпилировать, закешировать в памяти и.т.д.
2) Сделать скрипт корутиной и в каждом цикле делать ему lua_resume
(http://www.lua.org/manual/5.1/manual.html#lua_resume). Очевидное
достоинство этого способа - мы решаем проблемы кеширования, упрощаем
хранение состояния между циклами и.т.д. Очевидный недостаток - общее
усложнение и потеря возможности редактирования скрипта запущенной игры
(это решаемо).
1) Не могли бы подсказать литературу по данному поводу (желательно на русском)?
На русском точно не подскажу. Посмотрите простой движок, который использует луа для скриптинга,
например http://love2d.org
2) Я так понимаю, что за delta_time следить и Lua, т.е. оно (delta_time) передается ему и код выглядит примерно так:
? Т.е. как вообще делают?
В простых случаях так примерно и делают. В сложных пишут диспетчер который следит за этим централизованно.
|
 |
|
|
_Dmitriy_ wrote:
1) Остановка
Есть два потока - основной и поток, в котором выполняется Lua. Допустим, в первом потоке произошло событие, например, нажатие кнопки. Как при этом остановить выполнение скрипта?
Просто - никак. Луа поддерживает кооперативную многозадачность, что по простому означает, что скрипт сам решает когда ему остановится.
Но мне кажется, вы совершаете ошибку помещая lua VM и main-loop в разные потоки - так обычно не делают. Обычно из главного цикла вызывают скрипт (или возобновляют корутину).
2) Синхронизация
Есть те же потоки. Допустим, в Lua зарегистрированы 2 функции, например, «идти» и «атаковать».
В script.lua
Как замедлить выполнение функций, т.е. после изменения логики (вызов функции) должно пройти несколько отрисовок (анимация и прочие)?
Обычно игровой цикл выглядит как-то так:
Если вы будеты вызывать скрипты внутри do_phisics у вас даже не возникнет такого вопроса.
Если же вы спросили как на один do_physics сделать несколько do_draw - следите за delta_time.
|
 |
|
|
SergeySG wrote:Хотел следующего:
result:
первые 4 байта 0 (x)
0
0
0
0
вторые 4 байта 0 (y)
0
0
0
0
третьи 4 байта (w)
1 <- 1 (первый байт)
1 <- здесь 1 уже означает 256. 256 + первый байт = 257
...
Теперь хотелось бы оптимизировать выделение памяти строку rect=' '
О, это все это наследие китайцев.
В вашем коде серьезная проблема - строки в Луа анмутабельны и уникальны, поэтому отныне все строки из 16 прбелов в вашей системе испорчены вплоть до перезагрузки луа.
Попробуйте ниже написать:
Если бы функции Win Api возвращали бы через стек, проблем бы не было, вы могли бы минимально допилив библиотеку указывать при импорте функции сколько байт она будет возвращать и возвращали бы строку. А так, возможно стоит ввести понятие OUT аргументов и допилить слегка цикл разбора, чтобы вызывать функции как-то так (тип 'table' в оригинальном коде был свободен) :
|
 |
|
|
SergeySG wrote:возвращаемое функцией значение является указателем на тип
как прочесть содержимое userdata стандартными средствами ( не используя прибамбасы типа lpack, memarray, struct etc...) ?
например:
udataVal=foo() -- return lpRECT in lightuserdata
и как ее f:read() ?
Навскидку:
1) Если вам хочется иметь синтаксис f:read() - вам нужна userdatа и метатаблица.
2) Функция read по любому должна быть написана на С.
3) Вы, конечно, можете написать раз и навсегда (на С) функцию, которая будет возвращать в строке сырую память, но зачем если уже есть lpack, struct etc.
|
 |
|
|
sarjsheff wrote:В cgilua входит serializer.lua для этих целей.
Он даже не может сериализовать рекурсивные таблицы. На дело даже не в этом.
Претти принтер должен отображать структуры данных в виде удобном для восприятия человеком.
Поэтому мой старается по возможности убирать ненужные "[]" из ключей, сортирует поля по алфавиту
и форматирует предстявление учитывая ширину страницы (по умолчанию 78, заполнение 0.6) и.т.д
Маленький вдохновляющий пример:
Печатает:
|
 |
|
|
Не знаю кого как, а меня в луа всегда бесило отсутствие претти принтера - т.е.
print({1,2,3}) выдает вам невразумительное table: 00FFAABB, вместо {1,2,3}.
Для себя я проблему решил, может еще кому пригодится:
|
 |
|
|
vonrims wrote:Всё просто пока всё просто.
10 вызовов прокатило, Executor ещё жив и я хочу вызвать функцию "foo"... Вызвал... Потом ещё 10 раз хочу вызвать первую безымянную функцию... И взять её уже неоткуда...
Но самом деле первая безымянная функция так и лежит на стеке и вы можете вызвать ее еще n раз - в вышепреведенном примере я ее явным образом стер командой lua_pop(L,1).
|
 |
|
|
vonrims wrote:
z00n wrote:
Я так понял, что вам не нравится, что lua_call/pcall убирают со стека и аргументы и функцию?
Сдуплицируйте функцию (и аргументы если надо) командой lua_pushvalue, вызовите, повторите.
Не всегда мне нужно выполнять весь скрипт. Может понадобиться результат отдельной функции. В любом случае, класс Executor не должен лишать меня возможности в любой момент вызвать на выполнение весь скрипт или отдельно взятую именованую функцию.
Я перестал понимать, простите. Если вам нужен результат отдельной функции, положите ее на стек, потом аргументы и вызовите ее.
Возвращаясь к предыдущему, вот пример вызова скрипта 10 раз:
|
 |
|
|
vonrims wrote:Доброго времени суток.
Допустим есть Lua-код
...
Я так понял, что вам не нравится, что lua_call/pcall убирают со стека и аргументы и функцию?
Сдуплицируйте функцию (и аргументы если надо) командой lua_pushvalue, вызовите, повторите.
|
 |
|
|
Berkut wrote:
Проблема в том, что исходя из кода программы, он должен быть закрыт. В функции сохранения сообщения файл закрывается. При входе пользователю выдаются сообщения из файла, но и там файл закрывается. Если я просто пытался закрыть файл, отладчик выдаёт, что не может найти открытый файл (естественно, я пытаюсь закрыть именно тот файл, который открывал через другие функции).
Это все врядли так - закрытый файл без проблем удаляется любым способом:
Я не знаю, попробуйте локализовать проблему или дайте компилирующися кусок кода с проблемой.
|
 |
|
|
|
|