[Logo] LUA Форум
  [Search] Search   [Recent Topics] Recent Topics   [Hottest Topics] Hottest Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
Messages posted by: z00n
Forum Index » Profile for z00n » Messages posted by z00n
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).
 
Forum Index » Profile for z00n » Messages posted by z00n
Go to:   
Powered by JForum 2.1.9 © JForum Team