Здравствуйте, гость ( Вход | Регистрация )

35 страниц V « < 31 32 33 34 35 >  
Ответить в эту темуОткрыть новую тему
> Помогите освоить LUA
Cockney
сообщение 9.3.2019, 12:45
Сообщение #641


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



КАК ПРОВЕРИТЬ ИЗ СИ, НЕ ЛУА. ИМЕЯ ЧИСТЫЙ МАССИВ БАЙТ.

Цитата
далее идет проверка наличия в lua'шной таблицы полей usl.*
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.3.2019, 12:52
Сообщение #642


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Корявый способ:
1) в луа через new создаем некоторый массив
2) при выозове си функции просто передаем этот массив (по указателю должен улететь)

Корявый опционально:
1) Имеем некоторый массив А луа.
2) в луа через new создаем некоторый массив В
3) присваем значения элементам массива В значения из массива А
4) передаем массив В в си.

Возмжно пройдет прозрачное преобразование типов A->B при необходимости (надо тестить).

Что ты хочешь сделать? cdef позволяет объявлять сишные структуры. Не пойдет?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.3.2019, 13:17
Сообщение #643


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Хочу иметь

Код
int func(uint addr, uint x1, uint y1, uint x2, uint y2, uint* usl, uint numf)


на входе в длл.

с возможностью вызова из скрипта

Код
fc.func(img, 1,1,100,100, {B = 10}, 10)


с возможностью

Цитата
проверка наличия в lua'шной таблицы полей usl.*


из Си кода, НЕ ИЗ СКРИПТА.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.3.2019, 13:34
Сообщение #644


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



https://luajit.org/ext_ffi.html последний пример.
Т.е. походу через new придется объявить массив. Т.е. будет:
Код
ffi.cdef[[
typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;
]]
local usl = ffi.new("rgba_pixel[1]") -- тут может быть косяк с синтаксисом. ffi.new("rgba_pixel[?]", 1)
my_func(usl)

Цитата
fc.func(img, 1,1,100,100, {B = 10}, 10)

может проканает прозрачно, возможно придется сделать микро-обертку на луа для засовывания луа таблицы в new. Надо тестить.

Сообщение отредактировал DarkMaster - 9.3.2019, 13:35


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.3.2019, 14:34
Сообщение #645


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Массив то по указателю улетит а дальше что ? Как там выцепить R,G или RG2, если порядок не определен.


Ладно, это нерешаемая при помощи ffi проблема, по крайней мере пока.


Возврат из функции тоже предлагаешь делать указателем ? На что ? на кусок памяти в котором различные структуры ? Кто память освобождать будет ?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.3.2019, 15:18
Сообщение #646


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
Массив то по указателю улетит а дальше что ? Как там выцепить R,G или RG2, если порядок не определен.

Порядок не определен в луа таблице. Когда ты объявляешь массив или структуру через new - он определен жестко. Это типы данных си в чистом виде. По поводу передачи my_func({b=100}) вполне возможно по имени ключа подхватит.
Цитата
Ладно, это нерешаемая при помощи ffi проблема, по крайней мере пока.

Сомненеия у меня большие. Тут либо пройдет вышеописанный способ либо знания пошире нужно.
Цитата
Возврат из функции тоже предлагаешь делать указателем ?

Если ты хочешь вернуть кучу параметров, то вариантов особо нет. Причем это не луа, а си не даст. Я бы предложил вернуть структурой. Причем ее объявлять даже не нужно будет нигде кроме cdef. Т.е.:
Код
ffi.cdef[[
typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;
rgba_pixel my_func();
]]
local result = my_func()
print (result.red + 1,
        result.green / 2,
        result.blue,
        result.alpha)

Все прозрачненько.
Цитата
Кто память освобождать будет ?

result = nil

Сообщение отредактировал DarkMaster - 9.3.2019, 15:58


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.3.2019, 15:34
Сообщение #647


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Цитата
result = nil


ну в скрипте ты занулишь, а менеджер памяти си не знает такого.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.3.2019, 15:48
Сообщение #648


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
ну в скрипте ты занулишь, а менеджер памяти си не знает такого.

А где потвоему все хранится?) Это все СИ. И даже когда ты делаешь:
local a = "вася"
a = nil
Это все так же нулит си. То, что для этого создан garbage collector сути не меняет - нулить все так же будет си.
Правда в винде у меня есть вопросы у уборщику. Он не возрващает память системе. Она освобождается, может повторно быть использована приложением, но не освобождается для системы.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.3.2019, 16:00
Сообщение #649


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Например в инстансе менеджера памяти конкретного объектника. Попробуй высвободить из своей длл память, выделенную другой длл. Если повезет получишь

Цитата
Возвращаемого значения не имеет. free() не проверяет указатель на правильность, и может «освободить» невыделенную область памяти, что в некоторых реализациях может привести к необратимому повреждению кучи


Т.к. опять же, в твоей длл этот адрес будет невыделенным.


В мусорщике для этого как раз колбеки есть для этого, на сколько помню.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.3.2019, 16:27
Сообщение #650


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Есть у меня скромное подозрение, что память выделит под объект lua, а запишет туда уже dll'ка. Но это чисто домыслы. Т.е. вместо:
local result = my_func()
на самом деле будет вызвано:
local result = возвращаемый_тип
result = my_func()
При таком подходе проблемы быть не должно. Но это еще раз говорю пальцем в небо.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.3.2019, 17:52
Сообщение #651


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Тогда в длл через параметры вызова функции надо тянуть указать на буфер для возвращаемого результата.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.3.2019, 2:28
Сообщение #652


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
Тогда в длл через параметры вызова функции надо тянуть указать на буфер для возвращаемого результата.

Зачем?
some_user_type my_var;
my_var = my_dll_func();
насколько я понимаю alloc вызван будет во время объявления. Ну в крайнем случае можно проинициализировать null'ом. Соответственно уже не длл память выделила. Вот если бы результат возвращался в виде указателя, а не в виде данных, то тогда да, беда была бы страшная, а тут данные.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 10.3.2019, 15:06
Сообщение #653


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21064
Пользователь №: 16.156



Проверил сборкой не оптимизированной. Структура хранится в стеке процедуры(на самом деле это глобальный стек ,просто сдвинут указатель). На выходе происходит копирование этой структуры в тот же стек, но по другому адресу. Если jit не знает о такой особенности, то на циклах это может вызвать неприятные ощущения.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 10.3.2019, 18:21
Сообщение #654


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Я не стал морочиться с dll. Поскольку я отказался от чтения памяти при поиске, а работаю теперь напрямую с СИ-шными массивами, прирост скорости при непосредственно самом поиске будет незначительным. Лишнее время тратится только на получения СИ-шного массива образа снимка экрана, на моей машинке - это всего около 2 тысячных секунды (1920х1080). Плюс вопрос о порядке ключей в таблице так и остался открытым, как его передавать в DLL? Хотя конечно можно задавать условие и строкой, как я раньше и делал, на какие-то микросекунды получается медленнее. Единственно, что реально было бы круче в DLL - анализ контрастности пикселей снимка экрана. Только таких задач на практике - на пальцах одной руки можно пересчитать и если у продвинутого пользователя возникнет такая задача, можно сделать локальную функцию, выкинув из неё всё лишнее и будет не особо медленнее. Я так и сделал и для колора и для имиджа (для поиска в условиях день-ночь). Но вы парни - молодцы, что пытаетесь всё-таки сделать DLL!!!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KaZaK
сообщение 13.3.2019, 23:40
Сообщение #655


**

Neophyte
Сообщений: 28
Регистрация: 10.2.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.228



Добрый день!


Поясните как передать переменные или их значения между двумя работающими скриптами?
через _G ??
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 14.3.2019, 9:19
Сообщение #656


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Каждый скрипт - это отдельная lua машина. Т.е. связи между ними по большому счету нет. Могу предложить использовать для этого сокеты. Там уже и асинхрон реализован и все прекрасно. Если совсем по-дубовому, то можно использовать тхт файл или буфер обмена.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KaZaK
сообщение 14.3.2019, 9:56
Сообщение #657


**

Neophyte
Сообщений: 28
Регистрация: 10.2.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.228



Цитата(DarkMaster @ 14.3.2019, 10:19) *

Могу предложить использовать для этого сокеты. Там уже и асинхрон реализован и все прекрасно.


Можно чуть подробней?! это потоки?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 14.3.2019, 10:14
Сообщение #658


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27725
Пользователь №: 11.279



Цитата
Можно чуть подробней?! это потоки?

Это сеть =) Порты. tcp/udp


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KaZaK
сообщение 14.3.2019, 12:36
Сообщение #659


**

Neophyte
Сообщений: 28
Регистрация: 10.2.2019
Группа: Пользователи
Наличность: 0
Пользователь №: 19.228



O_O я о них ничего не знаю( и даже не представяю с какого боку заходить...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName212
сообщение 14.3.2019, 14:00
Сообщение #660


**

Neophyte
Сообщений: 13
Регистрация: 6.10.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.068
Возраст: 28



Можно ли сохранить урл страницы открытой в браузере в памяти пилота?
Получилось сохранить его в файл но, этого не достаточно...
вот код, сохраняет в файл урл(если файл есть, если нету то код скрипта туда запишет)

Код
--lua
function copyUrl ()
wait ("1000")
local x, y = 260, 448
   move (x, y)
wait ("1000")
   kright (x, y)
wait ("1000")
clickoffsetx (30)
clickoffsety (120)
   move (x, y)
wait ("1000")
   kleft (x, y)
local text = clipboard ()
   write ([[C:\DAYR_LAST\1111111.txt]], text)
end
copyUrl ()


а вот попытки сохранить урл в память не увенчались успехом. Там от ссылки отрезать нужно "http://", сравнить её с другими ссылками в общем (IMG:style_emoticons/default/ohmy.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

35 страниц V « < 31 32 33 34 35 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 27.4.2024, 15:03
Designed by Nickostyle