Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
altmax
181 / 48 / 19
Регистрация: 23.12.2016
Сообщений: 158
Завершенные тесты: 1
#1

Lua и luabridge - C++

10.03.2017, 10:58. Просмотров 802. Ответов 3
Метки нет (Все метки)

Остались еще специалисты по столь древнему инструменту как luabridge?

В методе класса объявляю

C++
1
2
3
4
5
6
7
8
lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    getGlobalNamespace(L)
        .beginClass <class1>("Class1")
        .addFunction("SetPerem", &class1::setperem)
        .endClass();
    luaL_dofile(L, "script.lua");
    lua_pcall(L, 0, 0, 0);
и вызываю из main этот метод класса. Возникает вопрос - каким образом из скрипта lua достучаться до метода setperem? Если писать без ООП то методы С++ из скрипта легко вызываются. А тут либо ничего не изменяется, либо вылетает исключение. Хотелось бы увидеть пример использования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2017, 10:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Lua и luabridge (C++):

Lua vs Json
Добрый день, встречаю, который проект на ряду, которые связывают С++ с Lua,...

Инжектор lua-скриптов
Хочу написать написать свой инжектор луа-скриптов для одной программы. Как...

Макросы и скрипты (Lua)
У меня тема курсовой - использование языка lua в качестве макросов в языке c++....

Code::Blocks 13.12 и Lua = ошибка lua_open
Привет, подскажите в чем проблема: этот код работает нормально: #include...

Как в visual studio 15 написать самый простой код на LUA
Хочу написать самый простой код на LUA в VS. Для этого взял готовый пример из...

Runtime error при открытии lua-скрипта
Всем доброго времени суток. Есть функция, задача которой прочитать...

3
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.03.2017, 16:57 #2
Цитата Сообщение от altmax Посмотреть сообщение
Возникает вопрос - каким образом из скрипта lua достучаться до метода setperem?
Через :

Цитата Сообщение от altmax Посмотреть сообщение
Хотелось бы увидеть пример использования.
На основе твоего:
С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstdio>
 
#include "lua.hpp"
#include "LuaBridge/LuaBridge.h"
 
class class1
{
public:
    void setperem(int v)
    {
        m_v = v;
    }
    int getperem() const
    {
        return m_v;
    }
 
public:
    int m_v;
};
 
int main()
{
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    luabridge::getGlobalNamespace(L)
        .beginClass<class1>("Class1")
        .addConstructor<void(*)()>()
        .addFunction("SetPerem", &class1::setperem)
        .addFunction("GetPerem", &class1::getperem)
        .endClass();
 
    luaL_dofile(L, "./script.lua");
    lua_pcall(L, 0, 0, 0);
}

LUA

Код
obj = Class1()

obj:SetPerem(42)

print( "value " .. obj:GetPerem() )
3
altmax
181 / 48 / 19
Регистрация: 23.12.2016
Сообщений: 158
Завершенные тесты: 1
10.03.2017, 22:28  [ТС] #3
Т.е. получается что мы создаем класс С++ в lua и уже там используем его методы? Мне надо чуть другое, просто изначально неправильно сформулировал вопрос, за что приношу свои извинения.
Следует читать как : "Возникает вопрос - каким образом из скрипта lua достучаться до метода setperem уже существующего объекта класса?" Т.е. я создаю объект класса, в котором куча методов для взаимодействия кода С++ со скриптами lua. И уже эти методы существующего объекта класса я вызываю из lua.
Нашел я кое-какие материалы по этому поводу - задача не тривиальная, но достаточно легко решаемая. Или это неправильный подход, и проще создать этот класс-адаптер уже из скрипта lua и оттуда же управлять им?

Добавлено через 1 час 33 минуты
если метод объявить static то его можно экспортировать в lua через
C++
1
 .addFunction ("setter", this->setperem)
прямо из содержащего его класса. Вообще эта самая addFunction работает почему-то только со static методами класса или независимыми функциями. Вот думаю, может попробовать с friend функциями в классе, т.к. static не всегда можно использовать.
0
altmax
181 / 48 / 19
Регистрация: 23.12.2016
Сообщений: 158
Завершенные тесты: 1
12.03.2017, 10:32  [ТС] #4
Более менее разобрался, вроде всё заработало, может кому пригодится

Код класса, из которого вызываем скрипт Lua.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class class1
{
private:
    int perem1;
public:
    int getperem ();
    void setperem (int a);
    void print ();
    void DoLuaScript ();
    class1(void);
    ~class1(void);
};
class1::class1(void)
{
    perem1 = 100;
}
 
void class1::setperem (int a)
{
    perem1 = a;
    return;
}
 
void class1::print ()
{
     std::cout << perem1<< endl;
     
}
 
void class1::DoLuaScript ()
{
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    getGlobalNamespace(L)
        .beginClass <class1> ("Class1")
        .addConstructor<void(*)(void)>()
        .addFunction ("SetPerem", &class1::setperem)
        .addFunction ("PrintPerem", &class1::print)
        .endClass();
    luaL_dofile(L, "script.lua");
    lua_pcall(L, 0, 0, 0);
    LuaRef MyFunc = getGlobal(L, "MyFunction");
    MyFunc (this);
        
}
скрипт Lua

C++
1
2
3
4
5
6
7
-- script.lua
 
MyFunction = function (Class1)
  print "Lua function is doing!!!"
  Class1:SetPerem (565)
  Class1:PrintPerem ()
end
Ну и main
C++
1
2
3
4
5
6
class1 MyClass;
    MyClass.print();
    MyClass.DoLuaScript();
    MyClass.print();
 
    system("pause");
Т.е. мы вызываем из С++ функцию скрипта Lua, передаем туда указатель на объект класса this, и вызываем уже из функции скрипта те функции класса C++, которые экспортировали именно для переданного объекта this. Всё оказалось проще, чем я думал, но найти решение в недрах интернета было нелегко.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2017, 10:32
Привет! Вот еще темы с решениями:

LUA + QT
Такая задача: Есть Lua-файл приблизительно такого содержания: Необходимо...

LUA + C++
Привет всем :) я чото не понимаю чо у меня выевляется ошибки luaavg.obj...

Lua 5.3 и LuaJit
Возможно ли совместить subj в проекте одновременно? Требуется часть скриптов...

Lua, Android
Доброго времени суток. Хочу попробовать себя а в разработке игр под Android...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru