| Author |
Message |
|
|
GrayFace wrote:А что такое weak value?
Это вот такая таблица:
Они нужны чтобы держать weak-reference на обекты - у вас есть ссылка, но это не мешает GC собирать объект, если на него нет других, не-слабых ссылок.
http://en.wikipedia.org/wiki/Weak_reference
http://www.lua.org/pil/17.html
|
 |
|
|
Berkut wrote:
z00n wrote:
Сработало. Только для начала файл открыть нужно было
Дело в том, что файл уже открыт, раз вы не можете его удалить. Найдите где в вашей программе вы открываете файл и не закрываете его. Если вам нужно держать файлы открытыми - заведите глобальную lookup-table :: {filename->filehandle} c weak value. Это позволит закрывать файл по имени перед удалением.
|
 |
|
|
Berkut wrote:Не пойму, в чём суть проблемы. Есть вот такой кусок кода с обработкой команды:
Мне кажется проблема в том, что вы не закрываете файл перед тем как пытаетесь его удалить.
Попробуйте так:
|
 |
|
|
GrayFace wrote:Это будет быстрее? 
Скорость будет примерно одинаковая - несколько миллионов тестов в секунду. Читаются паттерны намного лучше.
|
 |
|
|
GrayFace wrote:Спасибо.
А что в Lua невозможно взять i-тый символ строки? Код a[1] >= "A" and a[1] <= "Z" не работает. Наверное, лучше всего в таком случае использовать string.byte?
В принципе да, можно писать a:byte(1) >= ("A"):byte(1) или
но лучше пользоваться паттернами (http://www.lua.org/pil/20.2.html)
например
|
 |
|
|
GrayFace wrote:Спасибо, собралось.
А как вызвать функцию, передав ей таблицу не как 1 из параметров, а как список параметров? (т.е. мне нужно предварительно подготовить список параметров для функции - я для этого кладу их в таблицу)
unpack
|
 |
|
|
В корневой директории исходников Pluto (там где README) создайте директорию "LUADIR" и положите туда все 4 заголовочных файла луа и lua51.lib(или lua5.1.lib - что вам ближе)
Дальше, из командного окна VS, находясь в корневой директории Pluto, наберите:
Так наверное проще всего
|
 |
|
|
Strijar wrote:
z00n wrote:Ссылка - это результат luaL_ref? Создайте свежую таблицу и сохраните ее с тем-же ref-ом. 
Как я уже писал этот ref может упоминаеться в других "объектах" (lua или С). Пока, работает и так, но это несколько ограничивает
Так ref - это просто целочисленный индекс, по которому таблица "лежит" в REGISTRY. Если старая таблица больше не нужна, положите по этому индексу новую(не делая unref).
|
 |
|
|
Strijar wrote:
smz wrote:Часто такая ситуация может возникать от неудачного дизайна. Ну, а также можно вместе с заменой таблицы на новую, произвести "ручками" и обновление ссылки, хотя это уже скучно.
У меня таблица создается из С++ кода (таблица это C++ объект) и в нем же сохраняется ссылка на нее. Из С++ кода работа с таблицей идет именно по ссылке. Некоторые объекты связаны между собой - так что обновлять ссылки проблематично.
Можете предложить другой вариант? 
Ссылка - это результат luaL_ref? Создайте свежую таблицу и сохраните ее с тем-же ref-ом.
|
 |
|
|
smz wrote:
z00n wrote: Чтобы сработал GC, есть трюк, хотя, конечно, нужно всегда создавать новую таблицу:
Это правда, но... во-первых трюки лучше оставить для языков более низкого уровня, чем Lua, а во-вторых этот трюк не всегда работает: ...
Я не прызываю использовать это в коде - боже упаси, просто бывает полезно знать, что происходит в том или ином случае. Трюк работает всегда, но только для array part (в общем, понятно почему).
|
 |
|
|
Чтобы сработал GC, есть трюк, хотя, конечно, нужно всегда создавать новую таблицу:
smz wrote:У замены таблицы на новую есть ещё одно положительное свойство - правильное освобождение памяти. К сожалению, стирание всех элементов таблицы не освобождает память полностью.
Вот пример, который это демонстрирует:
[ ...
|
 |
|
|
Я бы вам посоветовал освоить какой-нибудь генератор враперов: SWIG или tolua - зачем вам нужно делать это руками?
Но если очень хочется, то вот пример:
Чуть-чуть упрощенный(выкинуто наследование и тривиaльные операции) пример биндера из статьи
Binding C/C++ objects to Lua by W. Celes, Luiz H. de Figueiredo, R. Ierusalismchy.
Обертки для пары операций над типом
Тест:
выдает:
|
 |
|
|
Практически все приведенные здесь функции во первых "глотают" ошибки, которые в io выглядят как nil+message, во-вторых небезопасны в смысле исключений.
Например:
Теперь, например, сделаем 11.gz read-only:
... т.е. первый файл остался открытым до тех пор, пока его не соберет сборщик мусора, так-как исключение не дало вызвать source:close().
Про один из подходов к безопасной работой с ресурсами можно почитать тут: http://lua-users.org/wiki/FinalizedExceptions - Диего Нехаб пишет как он сделал в luasocket.
Я обычно пользуюсь похожим, но более общим (который подходит для Лиспа, Скалы, SML и вообще для любого язака с функциями высших порядков) способом.
Когда все нормально (уберем read-only):
Т.е. все само вовремя закрывается, деструкторы вызываются в порядке, обратном вызову конструкторов. Синтаксис громоздкий, но это Луа В Scala, например, это выглядит намного изящнее:
|
 |
|
|
|
У меня нет MFC - откомпилировать я это не могу, но lua.lib которая входит в комплект - статическая, значит никакая dll в принципе не нужна. В этом наверное и проблема, приложение берет свои луа-функции а powerbasic лезет за ними в dll (хотя я конечно не в курсе как там у вас все работает).
|
 |
|
|
А вы попробуйте для начала:
http://luaforge.net/frs/download.php/1883/lua5_0_3_Win32_dll8_lib.zip
http://luaforge.net/frs/download.php/1882/lua5_0_3_Win32_dll7_lib.zip
Это тоже самое но собрано не mingw а MSVC 7.1 или 2005. Для версии dll8 вам может понадобиться поставить Microsoft Visual C++ 2005 Redistributable Package (x86).
|
 |
|
|
|
|