Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393

Перенос функции с++ на lua

28.12.2018, 18:47. Показов 1934. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые программисты, появился вопрос lua api c++, хочу научиться прикручивать lua к коду с++. Конечно, сложно, но научиться можно. У меня на компе стоит lua 5.3, но в этой папке нет папки incude, которую нужно по-моему переместить в проект на с++. Где её взять? Скачивал много раз установщик, но она так и не появлялась. Хочу перенести на lua простую функцию, которая выводит сообщения на экран.
https://www.youtube.com/watch?v=mT0KpgDVy4I

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>  
 
using namespace std;
void pri() {
    cout <<"hi " << endl;
}
int main(int args, char* argv[]) {
 
    pri();
    return 0;
    system("pause");
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.12.2018, 18:47
Ответы с готовыми решениями:

Вызов lua функции в C++
Здрасте! Как вызвать функцию, написанную в луа скрипте? (lua 5.2) Всё уже облазил, а ответ никак не найду :-| То говорят о другом, то...

LuaBridge, вызов функции lua из c++
Здравствуйте. Использую враппер LuaBridge для связки c++ c lua L = luaL_newstate( ); luaL_openlibs(L); ...

Lua, ооп библиотеки, виртуальные функции
Не подскажет ли кто ооп библиотеку с возможностью создания виртуальных функций - и самое главное с возможностью из виртуальной функции...

7
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.12.2018, 10:56
Компилятор какой используете ?
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
29.12.2018, 11:00  [ТС]
Что вы имеете в виду под словом Компилятор? В студию 17. Простите меня пожалуйста за тупость Просто я только учусь.
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.12.2018, 12:14
Это и имею в виду. Для разных платформ и ОС существует множество компиляторов c/c++.
Студия от Микрософт - всего лишь одна из них.

Вы задали вопрос, требующий объемного ответа. Готовой инструкции у меня под рукой сейчас нет, поэтому наберитесь терпения, за день-два я сделаю описание того, что и как надо делать, тем более, что вопрос как я понимаю весьма актуальный.

ps: не говорите о себе уничижительно, у слов есть страшная сила сбываться...
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
29.12.2018, 15:53  [ТС]
У меня Windows 10 X64 очень буду ждать вашего ответа. На YouTube нет видео уроков как это сделать.
Зачем это всё нужно? Отвечаю есть sdk plugin для GTA http://forum.gtabuilder.ru/index.php?topic=337.0
Пишу плагины уроки в группе VK https://vk.com/gtabuilder
Хочу сделать moonloder для GTA Vice City Вот и вся задумка.
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
07.01.2019, 13:53
Эммм...

То есть вы хотите прикрутить Lua к конкретно этому sdk, а затем заняться разработкой lua-api к этому sdk?
Может быть проще поискать готовые решения?

Если же вы таки хотите использовать именно этот sdk, то присоединить lua к проекту плагина можно по-простому, то есть статически.

Исходники Lua берем здесь: https://www.lua.org/ftp/

Создаете проект плагина, в проекте делаете новый фильтр, например lua535, добавляете в него все файлы из папки src -- той самой, что содержится в скачанном архиве, за исключением luac.c.

Далее идем в проперти проекта, VC++ Directories -> Include Directories -- и добавляем сюда путь к папке src.

в нужных модулях плагина добавляем #include "lua.hpp"

Вот и все.

На самом деле чисто луашные скрипты могут быть медленными, поэтому я бы посоветовал использовать не Lua, а LuaJit:

http://luajit.org/
0
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
07.01.2019, 21:19  [ТС]
Спасибо огромное за Ваш ответ, уважаемый vantfiles, Вы совершенно правы. Да, я хочу прикрутить lua к hdk plugin https://github.com/DK22Pac/plugin-sdk, по lua-api очень мало информации, а на русском языке вообще нет. Поэтому, стараюсь разбираться. Очень и очень тяжело. С Вашего разрешения выложу то, что у меня получилось. Возможно, это поможет новичкам быстрее разобраться, мне потребовалось 2 недели. Хочу, чтобы кто-то не тратил столько времени на основы. Спасибо за подсказку по поводу luaJit.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
int main(int argc, char *argv[]) {
lua_State *lua = luaL_newstate();/*Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией-*/
lua_pushnumber(lua, 10);// отправить в стек число.
lua_pushnumber(lua, 20);// отправить в стек число.
lua_pushnumber(lua, 30);// отправить в стек число.
int number = lua_tonumber(lua, 1);// получить 10 из стека 1 
cout << number << endl;
int number1 = lua_tonumber(lua, 2);// получить 20 из стека 2
cout << number1 << endl; 
int number2 = lua_tonumber(lua, 3);// получить 30 из стека 3
cout << number2 << endl;
 
return 0;
}
 
 
#include<iostream>
#include<string>
#include <stdio.h>
#include <string>
#include"lua/lua.hpp"
using namespace std;
 
int main(int argc, char *argv[]) {
lua_State *lua = luaL_newstate();/*Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией 
 выделения памяти на основе стандартной функции C realloc и затем устанавливает "тревожную" (panic) функцию, 
 которая печатает сообщение об ошибке к стандартному выводу ошибки в случае фатальных (неустранимых) ошибок.
 Возвращает новое состояние или значение NULL, если есть ошибка выделения памяти.*/
    luaL_dostring(lua, "x = 2");/*отправляет строку- переменную = 2 в стек. Функция определяется как следующий макрос */
    lua_getglobal(lua, "x");// получить значение x
    if (lua_isnumber(lua, 1)) {//  если 1 позиция в стеке число.
        int number = lua_tonumber(lua, 1);
        cout <<"x = "<< number;
    }
    return 0;
}
 
#include<iostream>
#include"lua/lua.hpp"
using namespace std;
int main() {
    lua_State *S = luaL_newstate();
    luaL_openlibs(S);
    luaL_loadfile(S, "man.lua");
    lua_call(S, 0, 0);
    cin.get();
    return 0;
}
lua
--print(2362)
Добавление новой функцией в lua.
 
int lua_sq(lua_State *L) {// передаем указатель на состояние.
    int x = lua_tonumber(L, 1); // получаем 1 элемент из стека.
    lua_pushnumber(L, x*x);// умножаем x и отправляет в стек.
    return 1;// вернуть 1.
}
int main() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);//открыть все стандартные библиотеки lua.
    lua_register(L, "sq", lua_sq);// регистрируем функцию- имя состояние, имя функ в lua, имя функ тут.
    luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
    lua_pcall(L, 0, 0, 0);// вызов функции, передаем 2 параметра, возвращаем 1.
    lua_close(L);// закрыть состояние
    cin.get();//ожидает ввода символа программа завершается.
return 0;}
 
на Lua.
 
print(sq(2))
 
struct st
{
    int x;
 
};
 
int getst(lua_State *L) {// передаем указатель на состояние
    st* sp = (st*)lua_newuserdata(L, sizeof(sp));// выделяет памяти с заданным размером, 
    //помещает в стек пользовательские данные и возвращает этот адрес.
    int x1;
    if (lua_isnumber(L, 1)) {//  если 1 позиция в стеке число.
         x1 = lua_tonumber(L, 1);} // получаем 1 элемент из стека.
    else x1 = 0;// что мы передам в getst(2), то будет в структуре
    sp->x = x1;
    return 1;// вернуть 1.
}
int main() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);//открыть все стандартные библиотеки lua.
    lua_pushcfunction(L, getst);//уст указатель на функцию C++ и создает внутри Lua
    lua_setglobal(L, "getst"); //получает значение из стека и уст значение global name.
    luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
    //lua_pcall(L, 0, 0, 0);// вызов функции в lua файле.
    lua_getglobal(L, "sp");// получить значение глобальной переменной.
    st* sp = (st*)lua_touserdata(L, -1);// получить значение поля структруры из стека. 
    cout << sp->x  << endl;//   
    lua_close(L);// закрыть состояние
    cin.get();//ожидает ввода символа программа завершается.
return 0;}
 
lua
sp=getst()
print(sp)—адрес памяти выводится
 
 
 
#include<iostream>
#include<string>
#include <stdio.h>
#include"lua/lua.hpp"
using namespace std;
 
int main() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);//открыть все стандартные библиотеки lua.
luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
    //lua_pcall(L, 0, 0, 0);// вызов функции в lua файле.
    lua_getglobal(L, "t");// получить значение глобальной переменной, таблица.
    lua_assert(lua_istable(L, 1));// проверить является 1 элемент стека таблицей
    lua_pushstring(L, "x");// отправить ключ x в стек.
    lua_gettable(L, 1);// получить значение по ключу из стека.
    lua_assert(lua_isnumber(L, 2));// проверить является значение 2 элемента стека число.  
    int x = lua_tonumber(L, 2);
    lua_getglobal(L, "t");// получить значение глобальной переменной таблица.
    lua_pushstring(L, "y"); 
    lua_gettable(L, 1);
    lua_assert(lua_isstring(L, 4));
    string y = lua_tostring(L, 4);
    lua_getglobal(L, "t");// получить значение глобальной переменной, таблицей.
    lua_getfield(L, 5, "z");// отправить ключ в таблицу.
    lua_assert(lua_isboolean(L, 5));
    bool z = lua_toboolean(L, 5);// получить булевое значение по ключу.
    lua_getglobal(L, "t");// получить значение глобальной переменной, таблицей.
    lua_pushstring(L, "dog");// отправить значение в таблицу.
    lua_setfield(L, 5, "a");// уст ключ для него.
    lua_getglobal(L, "t");// получить значение глобальной переменной, таблицей.
    lua_getfield(L, 5, "a");// отправить ключ в таблицу.
    lua_assert(lua_isstring(L, 5));
    string a = lua_tostring(L, -1);
    cout <<"x = "<<x <<"\ny = "<<y<<"\nz = "<< z << "\na = " << a <<endl;
    lua_close(L);// закрыть состояние
    cin.get();//ожидает ввода символа программа завершается.
return 0;}
lua
 
t= {x=23,y="yes",z=true}
 
#include<iostream>
#include<string>
#include"lua/lua.hpp"
using namespace std;
int main() {
    lua_State *l = luaL_newstate();
    luaL_openlibs(l);
    luaL_dofile(l, "man.lua");
    lua_getglobal(l, "x");
    lua_getglobal(l, "y");
    lua_getglobal(l, "z");
    int x = lua_tonumber(l, 1);
    cout << x << endl;
    string y = lua_tostring(l, 2);
    cout << y << endl;
    bool z = lua_toboolean(l, 3);
    cout << z << endl;
    lua_close(l);
    return 0;
 
lua
x=3
y="jh"
z =false
 
struct strlua
{   int x;
strlua(int x){
    this->x = x;
}
void st(int x){
    this->x = x;
}
 
};
int LUA_new(lua_State *S) {
    strlua *p = new strlua(lua_tonumber(S, 1));
    lua_pushlightuserdata(S,p);
    return 0; 
}
int LUA_set(lua_State *S){
  strlua *p = (strlua*)lua_touserdata(S,1);
  p->st(lua_tonumber(S, 1 ));
    return 0;
}
int main() {
    lua_State *S = luaL_newstate();
    luaL_openlibs(S);
    lua_register(S, "new", LUA_new);
    lua_register(S,"set", LUA_set);
    luaL_loadfile(S, "man.lua");
    lua_call(S, 0, 0);
    cin.get();
    return 0;
 
a=new(2)
b=set(3) 
print(a)
print(b)
struct color{ char r,g,b;
};
void LUA_set(lua_State *S, string str, color *& pal) {
    lua_getglobal(S, str.c_str());
    lua_pushstring(S, "co");
    lua_gettable(S, -2);
    lua_call(S, 0, 4);
    pal[0] = *(color*)lua_touserdata(S, -4);
    pal[1] = *(color*)lua_touserdata(S, -3);
    pal[2] = *(color*)lua_touserdata(S, -2);
    pal[3] = *(color*)lua_touserdata(S, -1);
    lua_pop(S, 5);
}
int LUA_make(lua_State *S) {
    color *p = (color*)lua_newuserdata(S, sizeof(color));
    new (p) color;
    p->r = lua_tointeger(S, 1);
    p->g = lua_tointeger(S, 2);
    p->b = lua_tointeger(S, 3);
    return 1;
}
int main() {
    lua_State *S = luaL_newstate();
    luaL_openlibs(S);
    lua_register(S,"make", LUA_set);
    lua_register(S, "make", LUA_make);
    luaL_loadfile(S, "man.lua");
    lua_call(S, 0, 0);
    cin.get();
    return 0;
}
 
int main() {
    lua_State *l = luaL_newstate();
    luaL_openlibs(l);
    luaL_dofile(l, "man.lua");
    lua_close(l);
    return 0;
}
 
int main() {
    lua_State *l = luaL_newstate();
    luaL_openlibs(l);
    luaL_dofile(l, "man.lua");
    lua_getglobal(l, "pri");
    lua_pushfstring(l, "lua");
    lua_pushnumber(l, 5);
    lua_pcall(l, 2, 0, 0);
    lua_close(l);
    return 0;
}
 
Lua
 
function pri(ms,x)
for i=1,x do
print(ms) end
end
 
это вызывается в lua.
#include<iostream>
#include<string>
#include <stdio.h>
#include <string>
#include"lua/lua.hpp"
using namespace std;
 
int main() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);//открыть все стандартные библиотеки lua.
    luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
    lua_getglobal(L, "pri");// имя функции, которую вызываем в main.lua.
    lua_pushnumber(L, 3);// отправляем в стек число.
    lua_pushnumber(L, 5);
    lua_pcall(L, 2, 1, 0);// вызов функции, передаем 2 параметра, возвращаем 1.
    cout << lua_tonumber(L, 1) << endl;// получаем из стека возвращаемое значение из функции.
    lua_close(L);// закрыть состояние
 
return 0;
}
 
lua
 
function pri(x,y)
sum = x+y
return sum
end
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
07.01.2019, 22:55
>по lua-api очень мало информации, а на русском языке вообще нет.

Программирование на языке Lua Третье издание Роберту Иерузалимски
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2019, 22:55
Помогаю со студенческими работами здесь

Lua наследование, lua ооп
Подскажите пожалуйста, как наследовать класс? Не получается выдаёт ошибку local car = {} -- Прежде чем создавать экземпляры объекта,...

Возможно ли как-то использовать Lua функции, заложенные в клиенте игры Wow
Возможно ли как-то использовать луа функции, заложенные в клиенте игры Wow? Если можно, то как их можно использовать, чтобы программно они...

Вызов функции. Перенос переменной
Run-Time Check Failure #2 - Stack around the variable 'menu' was corrupted. Уже 2 часа не могу понять, почему эта ошибка... Помогите...

Перенос функции с mssql на pgsql
Приветствую! Нужна помощь в переносе функции: ALTER FUNCTION . (@id int) RETURNS nvarchar(max) WITH EXECUTE AS CALLER AS ...

Перенос Z оси функции plot3
Здравствуйте каким образом возможно перенести Z ось графика построенного с plot3 в правую сторону (как вторая ось y) при отображении в...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru