[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: eugenk
Forum Index » Profile for eugenk » Messages posted by eugenk
Author Message
Ёлы-палы ! Говорят "не мир тесен, а прослойка тонка" Я последние лет 8 только ПЛИСами и занимался... Конкретно Xilinx Virtex-2, Spartan-2 и Spartan-3. Сначала драл с их помощью защищенный контент с DVD-дисков. А с сентября 2004 по февраль 2008 подвизался по этому делу в одной зеленоградской конторке. Кеддах-электроникс инжиниринг. Может слыхал такую ? Сейчас как бы на фрилансе. Просто не охота в офисе сидеть и ищу только удаленку. Эту программу тоже делаю(точнее ДЕЛАЛ до прошлой версии) по некоему удаленному проекту www.angioscan.ru. А сейчас мне удалось убедить работодателя, что ему жизненно важны замышляемые мной в новой версии функции. Хотя нужны они в большей степени мне самому. Просто хочу сделать легковесную замену Matlab Simulink, причем гораздо более удобную чем настоящий Simulink и портируемую на мобильные платформы. Например на Nokia n810.

А для чего объект Net? Почему нельзя "подключать" напрямую вход на выход. В нем идет "искажение" сигнала?

Net - очень просто. Сигнал ведь может как угодно ветвиться. Net это то же самое что цепь в электронике. Канал связи. И правила точно те же что в электронике. Т.е. в каждой цепи один и только один источник, и сколько угодно (включая нуль) приемников. Только тут еще одно требование. Все пины включенные в цепь (выход и все входы) должны передавать и принимать одинаковый тип данных. Ну это можно трактануть как согласованные импедансы, так что тоже ничего нового


Не очень понятно почему нужно именно имя. Не достаточно разве ссылки на Lua объект? А ее очень легко можно получить при создании этого объекта и передать/записать (скрытно для пользователя) куда нужно для дальнейшего использования.

А вот с этого места пожалуйста подробнее. Мне нужно вызвать из кода на С++ совершенно определенный метод совершенно определенного объекта. В GUI я поступаю просто. Каждому созданному объекту в конструкторе присваиваю уникальный номер, он просто тупо растет по счетчику начиная с нуля, и передаю его в С++. А дальше этот номер через мою реализацию ООП явным образом передается во все С++ вызовы, работающие с GUI. Дальше элементу gui присваивается callbak, причем как имя. Выглядит это так(реальный код)


Здесь uid это пользовательский номер, позволяющий посадить несколько виджетов на одн каллбэк, а не уникальный номер.

С модулями увы, такой финт ушами не прокатит. По одной простой причине. dll-модулям такой механизм не нужен. И попытка ввести его для lua-модулей нарушит синтаксическое единообразие языковой оболочки. Что никуда не годится. Вот и чешу репу...
Вобщем-то фактически я сочиняю скорее некий пользовательский язык, на основе lua. Отсюда, а так же из-за того, что это фактически мой проект Hello world на lua, такое количество идиотских вопросов


P.S. Увы... Сейчас сделал простейший тест. В конструкторе Button поместил print(b1). В момент создания b1 оно печатает nil. При создании следующей кнопки печатается table:хеш-код. Это означает, что к моменту вызова конструктора именованная ссылка ещё не создается. А значит передать в конструктор имя создаваемого объекта нельзя никоим образом. Ибо в момент вызова конструктора этого имени в системе ещё нет. В связи с этим вопрос чего мне делать ?

P.P.S Уточненный тест, распечатывающий всю глобальную таблицу: (здесь g=_G, поскольку gui это модуль)

В момент создания кнопки b1, ключ b1 тестом не печатается. При создании следующей кнопки - печатается. Так что вопрос о передаче имени в момент вызова конструктора смело можно отправить по ведомству журавлей в небе. Прошу прощения что вылез с этим сюда, вместо того, чтобы сделать совершенно элементарную проверку. А с моими проблемами остается только поработать головой...

Strijar , как бы не совсем каллбэк. Моя программа замышляется для моделирования, анализа и обработки в реальном времени потоковых данных. Это может быть сигнал от какого-то датчика, либо данные из какого-то файла, или выход какой-то динамической системы... Короче всё что угодно. Необходимая обработка задается на языке потоковых диаграмм. Это что-то наподобее электрических схем. Берутся модули и соединяются цепями. Модули это какие-то алгоритмы обработки сигнала, цепи это пути передачи данных между ними. Вот пример совершенно реального скрипта из прошлой версии этой программы (еще без использования lua)


На lua это будет выглядеть примерно так:

В дальнейшем это конечно будет писаться не вручную, а в схемотехническом редакторе, но это пока не важно.

Теперь то что важно. Модули пишутся на C++ ввиде dll. lua-скрипты эти dll грузят. Вся дальнейшая работа происходит на С++ с помощью некой процедуры распространения сигналов по сети. Тут пока никакого тесного взаимодействия С++ с lua не требуется. Но если уж мы решили использовать lua, вполне логично разрешить писать на lua и сами модули. А вот тут начинается самое интересное. Синтаксис использования модуля написанного на lua очевидно не должен отличаться от модуля в виде dll. Но работа в схеме этих модулей различается здорово. dll строятся немного похоже на COM-объекты. Т.е. dll экспортирует функцию Create(), создающую модули, а сам модуль имеет строго определенный интерфейс, заданный через vtable. Точно такой же интерфейс имеют и модули на lua. Но если код на C++ вызывается через указатели, то для вызова кода на lua соответствующий модуль ещё нужно найти. Здесь и потребуется передавать в процедуру распространения сигналов его имя...

Прошу прощения, если написал немного путано. У меня-то всё это в голове... Но надеюсь объяснил, зачем в конструктор мне нужно передавать имя создаваемого объекта.
Тут речь идет о более интересных возможностях чем удаление. Например если нужно вызывать какой-то метод создаваемого объекта из кода на С++, это было бы весьма полезно. В моей Hello world, такая необходимость возникнет совершенно определенно. Ну и разумеется операция удаления при этом делается элементарно.

Как я это себе представляю. Пусть есть код:


Исполнить этот код виртуальная машина может двумя способами.
1a) Сначала создается ссылка с именем name.
2a) Вызывается функция Object() и результат её выполнения сохраняется по ссылке name.

1b) Создается временная ссылка tmp и по ней сохраняется результат вызова функции Object.
2b) Создается ссылка name и она заменяет ссылку tmp.

Мне почему-то кажется, что используется первый вариант. Во-первых он проще. Во-вторых оператор присваивания имеет два смысла. Как именно присваивание и как операция создания новых объектов. А потому первый вариант логичнее. Но если используется именно он, то по крайней мере есть теоретическая возможность узнать в конструкторе имя создаваемого объекта. Ведь ссылка создается ДО вызова конструктора.
Вопрос в развитие моего предыдущего вопроса об удалении ненужных объектов, но более общий и полезный.
Положим мы создаем кнопку в графическом интерфейсе

Есть ли способ узнать в конструкторе Button(), что имя создаваемого объекта будет b1 ?
Ну разумеется есть решение передавать в конструктор имя явным образом:

Но это не красиво и неудобно для пользователя.
Есть ли какой-то способ узнать это имя не задаваемое явно ?
Народ, если уж про такие вещи разговор зашел, хочу спросить, никто не юзал вот этого чуда https://savannah.nongnu.org/projects/libqtlua ?

Вчера скачал и глянул. Вроде весьма интересно. К сожалению у меня сейчас нет QT SDK и скачать его не могу ибо интернет очень слабенький и дорогой. Буду в Москве там скачаю. Увы, QT я никогда не пользовался ибо всегда юзал FLTK и lua с ним вязать начал. А сейчас хотелось бы что-то побогаче да желательно с уже готовой связью с lua. Короче порекомендуете, стоит пользоваться вышеназванной библиотекой или нет ?
У меня 3.0.2 build 119. Просто бред. При попытке выполнить скрипт выдает access violation при чтении по адресу 00000008. Меню Project не активировано, так что задать ему в options я ничего не могу. Пробовал запускать его из батника в котором прописана LUA_DIR - те же яйца, только в профиль. Не знаю чего с ним у меня творится.
Если не секрет, как ты его ставил и настраивал ? У меня например создаешь проект, а файлы в него не добавляются. Пункт меню "добавить файл" не активен. И ничего не может исполнить. Даже print(1+2). Кстати, только-только сообразил. Ему требуется устанавливать LUA_PATH и прочую лабуду ? У меня оно не установлено, поскольку lua и luac живут совместно с mingw32 в каталоге C:\MinGW\bin, к которому и прописан путь. А про наличие lua системе неизвестно. Может поэтому LuaEdit глючит ? Что ему вообще нужно прописывать, не подскажешь ?
Народ, ещё один вопрос из серии идиотских. Прошу ногами не пинать, ведь самые крутые из здесь присутствующих когда-то тоже были чайниками
Короче, кто на чем пишет и как отлаживается ?

Я сейчас использую SciTe из пакета Lua for Windows с luaforge. Дико им недоволен. Во-первых отладчик весьма убогий и неудобный. Во-вторых никак не могу его заставить понимать UTF-8. А UTF-8 для меня крайне важно, ибо именно с этой кодировкой работает FLTK-1.3, на котором у меня пашет GUI. Если конкретно говорить о SciTe, то самая лучшая IMHO русская сборка. Тут даже не в патриотизме дело, просто она объективно лучшая. Но увы, никак не удается прикрутить к ней отладчик, а без отладчика жить нельзя, поскольку моя чайниковсая "hello world" уже приближается к 500 строк на lua. Может кто-то пытался уже присобачить отладчик к русской сборке ? Посоветуйте как это делается !

Об отладчиках. У меня не пошел НИ ОДИН, кроме того, который встроен в SciTe из Lua for Windows. Редактор от wxLua виснет с фатальной ошибкой. LuaEdit не работает. Даже не создает нормальный проект. Ни один плагин под Eclipse тоже нормально не запустился. Очень вероятно, что это следствие некой кривизны рук... Мне в конце концов придется писать и редактор и отладчик, но пока хотелось бы просто выкатить само приложение в каком-то минимальном виде. Короче знатоки, посоветуйте отладчик !
Короче задача не имеет решения ?
По условию задачи я не могу удалять t1 непосредственно. Только через таблицу, в которой хранится ссылка на неё. Итого, задача не имеет решения ?
Посмотрел про слабые ссылки. Увы, не то...

Пока нашел способ избежать наихудшего из зол - обращения к удаленному виджету. Метод clear() вместо того чтобы удалять объекты будет помечать их специальным флагом, как недействительные. Тогда код на C++ сможет проанализировать этот флаг и выдать пользователю ошибку вместо того, чтобы выполнить что-то наподобее int x=(int*)NULL.
Но всё-таки хотелось бы такие объекты уметь удалять...

Setuper, гляди, задача ставится так. В начале мы создаём объекты t1, t2, t3....tn. Причем создаем их не как безымянные члены какой-то таблицы, и именно как индивидуальные именованные объекты. Ибо в дальнейшем мы будем обращаться к ним по имени. Например вызывать их методы. Затем создается сводная таблица всех этих объектов tt={t1,t2,t3...tn}. Дальше по ходу выполнения программы оказывается, что все объекты, которые мы записали в таблицу tt, перестали быть действительным. Вопрос, как их удалить разом, используя только таблицу tt ? На С++ просто делаем delete всем членам таблицы. Как это делается на lua ?
Народ, прошу прощения если вопрос идиотский, но я бьюсь с этим уже полдня и ничего не могу придумать.
Задача такая. В графической оболочке нужно когда требуется удалять виджеты. Очевидно так же нужно удалять связанные с ними lua-объекты. Хотя бы потому, что если пользователь по ошибке обратится по имени к уже удаленному lua-объекту, то получит попытку индексирования nil. А это куда меньшее зло, чем попытка обратиться к несуществующему виджету, к чему привело бы сохранение связанного с ним lua-объекта. Бывают виджеты-контейнеры, содержащие другие виджеты. Хотелось бы уметь удалять lua-объекты связанные с контейнерами так, чтобы автоматически удалялись все включенные в них объекты. Что я сделал. В объекты, связанные с контейнерами ввел дополнительную таблицу children. При включении объекта в контейнер, он добавляется в эту таблицу. При удалении контейнера, все включенные в в таблицу children объекты удаляются. Сам метод выглядит так:


По-идее должно получаться примерно следующее:

должно выводить nil nil
На самом деле этого не происходит ! b1, b2 несмотря на то, что были явно удалены (то что clear() работает с нужными объектами я убедился), остаются таблицами.
Вот совсем простой тест, проясняющий эту ситуацию:

Тест выводит две таблицы, с одинаковыми адресами, хотя я ожидал что во второй раз будет выведено nil.
В то же время очень похожий тест ведет себя как полагается:

Действительно меняется первый элемент t1.

Подскажите, как с этим быть. Т.е. как в первом из приведенных тестов удалить таблицу t1, обращаясь только к таблице tt.
Огромный респект ! Я с луа работаю неделю всего. Просто в программе которую я пишу, это программа моделирования и обработки потоковых данных, потребовался скриптовой язык, причем быстрый. Так что всё что я сейчас делаю, это вариации на вечеую тему "Hello world !" Поэтому рад любой помощи старших товарищей !
smz, прошу прощения, а где это можно скачать ? Да, это именно то, что мне нужно. Просто я не сумел правильно сформулировать мысль.
Setuper, да нет... Я лично пишу на Lua некую оболочку для пользователя. Т.е. набор простых в использовании объектов, типа тех же окон и кнопок gui. Свои ошибки я отлавливаю в консоли и для моей работы этот механизм не нужен. Нужен он будет пользователю, ибо в своих объектах я могу отловить далеко не все возможные его ошибки. Например пользователь определяет свою функцию, а при её вызове ошибается в одной букве и в результате происходит вызов несуществующей функции. Эту ошибку я перехватить и обработать уже не смогу. Её перехватывает интерпретатор. Вот и хотелось бы, чтобы такие вещи он сам, без моего участия выкидывал в графическое окно...
Спасибо, сейчас попробую. Я сейчас немного отошел от обработки ошибок и подключаю всё это дело к базе данных на sqlite, но ошибки у меня остались на ближайшее будущее. Можно еще вопрос ? Сейчас я использую некую самописную ООП-модель. Она построена целиком на функциях. Т.е. и в __index и в __newindex прописываются функции и например такой кусок кода:
w1=gui.Window(640, 480, "Test window");
w1.x, w1.y = 100, 200;

приводит во второй строчке к реальному перемещению окна вызовом кода на C++. Это очень здорово для пользователя. Но очень нездорово для быстродействия. Для gui это нормально. Но у меня будет некий скрипт, исполняемый периодически, грубо говоря по таймеру. Связан он не с gui. Хочется сохранить объектную форму записи, как для манипуляций с gui, однако сделать более быструю реализацию. Первое что тут приходит в голову, это динамическая генерация кода, что-то вроде макроподстановки. Например вызов w1.x=100 заменяется на w1:x(100). Lua, как я понимаю, вроде бы способна создавать код во время исполнения. И вроде даже понятно в каком направлении искать. Вопрос, никто не занимался подобным стилем программирования ? Какие тут могут быть тонкие места ? Есть ли на эту тему какие-то исходники ? Для меня это будущее, сейчас я другим занимаюсь. Но хотелось бы это будущее как-то себе представлять.


P.S. Попробовал предложенный рецепт. Не работает. Тест такой:


Выводит обычное сообщение об ошибке. Никакого dear sir не видно. То ли интерпретатор патологически невежлив, то ли функция error() предназначена для возбуждения исключительных ситуаций по инициативе программиста. А при исключениях возникающих в интерпретаторе, вызывается какой-то внутренний код.
 
Forum Index » Profile for eugenk » Messages posted by eugenk
Go to:   
Powered by JForum 2.1.9 © JForum Team