Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ Lua

Автор: cirus 11.3.2017, 21:37

1. Какая-то справка планируется?
2. Как присваивать значения массиву?
3. Функции lua я так понял тоже доступны?

Код
--lua
a,b = math.sqrt(10),math.sqrt(11)
c = a + b
log (c)

5. Как проверить цвет через if или findcolor?



Автор: Cockney 11.3.2017, 22:16

справок по луа в инете хоть ешь...

Автор: DarkMaster 11.3.2017, 22:17

Цитата
1. Какая-то справка планируется?

Вообще надо, но это самая большая беда. Т.е. по сути нужно делать зеркало вики.
Цитата
2. Как присваивать значения массиву?

arr[1] = 1
arr[1][1] = 1
arr[1][1][1] = 1
В луа массивы могут быть не прямоугольными. Ключи могут быть не числовыми, а текстовыми. Пока все ключи числовые - это массив, как только появляются текстовые, то получается таблица. Так же их можно использовать, как деревья.
3) да.
4) хз как так..
5) Через if не уверен в возможности. По финдколору нужно у кнайта уточнить. Что-то говорили по этому поводу, не помню.

Автор: cirus 11.3.2017, 22:49

Цитата
справок по луа в инете хоть ешь...

Для тех кто только скачал пилот они не очень-то помогут разобраться в синтаксисе. Особенно для тех кто не знает языков программирования.
Цитата
Вообще надо, но это самая большая беда. Т.е. по сути нужно делать зеркало вики.

Напиши хотя бы страницу введение в синтаксис lua. Остальное по понемногу допишется, когда сам разберусь что к чему smile.gif
Цитата
arr[1] = 1

Не работает так.
Можно так:
Код
--lua
a = {10,20,30,40}
log (a[1])
log (a[2])
log (a[3])
log (a[4])

Но это одномерный и присвоение пачкой.

Автор: Cockney 11.3.2017, 23:21

Цитата(cirus @ 11.3.2017, 22:49) *

Для тех кто только скачал пилот они не очень-то помогут разобраться в синтаксисе. Особенно для тех кто не знает языков программирования.



По моему, даже вики по пилотскому языку не сильно помогает новичкам. Хотя пилот упрощен донельзя(на самом деле даже наоборот, имхо). Если человек хочет разобраться - он и на с++ напишет, не говоря уже о луа. А тем ,кому нужен только результат, то им хоть 16 томов про объявление переменных напиши - пофиг. Луа это единый язык. Он одинаков во всех проектах. Достаточно указать как дергать функции пилота, а остальное пусть сами познают по учебникам, коих, как уже написал, полно.

Многомерность массива задается фигурными скобочками


Код
arr = {} //одномерный
arr = {{}} //2мер
arr = {{{}}} //3мер

Автор: cirus 11.3.2017, 23:47

Кому-то поможет справка и примеры, кому-то нет. Не стоит обобщать.

Цитата
Многомерность массива задается фигурными скобочками

Код
set %a [1 1] 100
set %a [1 2] 200
set %a [2 1] 300

Как это в Lua будет выглядеть?

Автор: DarkMaster 12.3.2017, 0:14

a={{}}
a[1][1] = 100
....

Автор: Cockney 12.3.2017, 0:44

А чем поможет справка ИМЕННО НА ВИКИ ПИЛОТА ? Как она доступней расскажет о луа ? В чем ее отличие ОТ ДРУГИХ СПРАВОК ? Вики пилота была нужна лишь из-за того,что язык узконаправленный и инфы про него нет, но луа...

Автор: DarkMaster 12.3.2017, 1:41

можно сделать какое-то краткое базовое введение, но смысла особо в большой справке рукотворной я не вижу. Проще скопипастить. Гораздо важнее существующие скрипты на пилоте, которые выложены на вике, переписать на луа.

Автор: cirus 12.3.2017, 1:55

Потому что в справках полно лишнего. Того что многим не понадобится, сначала так уж точно.

Код
В Lua всего 8 типов данных:
* nil (неопределенный)
* boolean (логический)
* number (числовой)
* string (строковый)
* function (функция)
* userdata (пользовательские данные)
* thread (поток)
* table (таблица)

Для большинства такая инфа вообще ни о чем не скажет. Я бы даже сказал отпугнёт. Это всё равно что первокласснику дать учебник по математике за 9 класс. Заглянул, решил что это слишком сложно и не стал учить математику вообще.
Для начала нужна самая суть и простейшие примеры.
Да, в справках примеры тоже есть: print("Hello World"). То, что в пилоте print нужно заменить на log в справках не написано.
Цитата
можно сделать какое-то краткое базовое введение, но смысла особо в большой справке рукотворной я не вижу

Согласен. Я сразу и написал Введение в синтаксис lua, а не полноценная справка.
Цитата
Гораздо важнее существующие скрипты на пилоте, которые выложены на вике, переписать на луа.

Переписывать явно не сейчас, а когда все функции будут полноценно работать.
Либо дописать примеры для lua, либо сделать отдельные страницы, чтобы потом подменить старые.

Автор: DarkMaster 12.3.2017, 7:43

Цитата
Переписывать явно не сейчас, а когда все функции будут полноценно работать.

Это лучший способ найти все баги =)

Автор: cirus 12.3.2017, 12:28

Код
--lua
log (color (553, 365))
if color (553, 365) == 6566912 then
    log ("Цвет найден")
else
    log ("Цвет не найден")
end

1. Вроде как, вполне понятная конструкция. И цвет определяет правильно, а в логе Цвет не найден.
2. Как теперь работают команды set\get?
get clipboard/set clipboard
get windowpos/set windowpos
и т. д.
3. Как вывести hint с параметрами?
4. Как работают save/load_array?








Автор: Cockney 12.3.2017, 12:43

2)никак

Автор: DarkMaster 12.3.2017, 13:05

Цитата
2)никак

Работают, но через заглушки. Что-то вроде
set (var, func)
точный вид надо в логи с кнайтом поднимать. сейчас нет возможности.

Автор: Cockney 12.3.2017, 20:50

Так а зачем бред городить, когда можно :

Код
var = "var"
func()


set же должен остаться в прошлой жизни.

Автор: DarkMaster 13.3.2017, 0:35

Цитата
Так а зачем бред городить, когда можно :

Это сделано не более чем для временной совместимости, чтобы сгладить углы. Не все можно сразу предусмотреть, а подобный подход позволит убрать некоторые возможные проблемы.

Автор: cirus 13.3.2017, 13:19

Код
--lua
if tonumber(color (273, 753)) == 16754189 then
    log ("Цвет найден")
else
    log ("Цвет не найден")
end

С этим разобрался, работает. Функции пилота определяются как sting, т. е. нужно преобразовывать в number.

Автор: cirus 13.3.2017, 14:55

Я так понимаю, теперь в 1 строке можно писать несколько команд, через ';'

Код
--lua
log ("clear"); log ("mode compact"); log ("open 100 100 400 250")
a,b=1,2
if a == b then log ("a равно b") else log ("a не равно b") end; log ("Конец скрипта")

Хотя и без ';' работает.

Автор: Cockney 13.3.2017, 15:14

или

Код
if color (273, 753) == "16754189" then

Автор: DarkMaster 13.3.2017, 15:19

имхо косяк - не должно оно быть стрингом.

Автор: cirus 13.3.2017, 15:32

Цитата
имхо косяк - не должно оно быть стрингом.

Это можно исправить или так и будет?
Код
--lua
a=round(12,34)    -- понятно же что в результате должно быть число
log (type(a))        -- а получается строка




Автор: cirus 14.3.2017, 3:16

Что с переменной workwindow?

Код
--lua
log (workwindow)  -- так 0
log (workwindow())  -- так ошибка

Тоже ошибка:
Код
workwindow = windowhandle()


Почему в lua не передаётся рабочее окно указанное через Ctrl + A?
Код
--lua
send ("F1")

Так не сработает.
Код
--lua
handle = findwindow("II")
workwindow = handle[1][1]
send ("F1")

А так нормально.

Автор: DarkMaster 14.3.2017, 11:01

на самом деле workwindow никогда не была переменной. Это всегда была фунция, котороя была обернута под переменную. Прозрачно сделать это на стороне луа не получится. "Прикинутся переменной" не есть стандартное поведения для функций и оно тут не реализовано. По сути дела необходимо, чтобы вызов workwindow() без параметров возвращал текущий хендл и все будет норм.

Автор: WKnight 14.3.2017, 20:13

Цитата
Почему в lua не передаётся рабочее окно указанное через Ctrl + A?
Починил.
Вообще workwindow это целая функция в пилоте, но на чтение ее можно и нужно использовать как обычную переменную, а вот присваивать только через set.
Так что "log (workwindow)" правильный вариант и возвращает правильное значение, а
"workwindow = handle[1][1]" работает только для тех функций, которым ничего особого от процесса не надо, и по сути есть баг.
Не послушался я Даркмастера, правильно он говорил, "делай ее функцией"...

Автор: cirus 15.3.2017, 3:27

Цитата
В Lua отсутствует нормальная возможность прервать выполнения скрипта из вне.
Поэтому, при остановке скрипта пилотом, глобальная переменная "terminate" устанавливается в "true".
И ее необходимо проверять с вкрипте Lua.
Кроме того, после установки "terminate" в "true", все вызываемые функции пилота игнорируюся.

Проясните этот момент. Как останавливать скрипты без ошибки?:
Код
--lua
while 1 == 1 and terminated ~= true do
   wait (10)
end
log (1)


Автор: DarkMaster 15.3.2017, 5:33

Цитата
log (1)

Оно вроде как должно:
Цитата
Кроме того, после установки "terminate" в "true", все вызываемые функции пилота игнорируюся.

А по факту выбивает ошибку. К кнайту.

Автор: WKnight 15.3.2017, 19:59

Починил вроде.

Автор: cirus 16.3.2017, 2:08

Бетки будут?

Автор: DarkMaster 16.3.2017, 2:23

надо. и надо не бетки, а хотфиксы стабильные.

Автор: DarkMaster 16.3.2017, 6:40

Кнайт, а почему не создавать по машине на вкладку и просто не грохать ее? Если грохать нитки, то там вроде поведение машины не определено.

Автор: WKnight 17.3.2017, 0:42

Будут, в выходные запилю, в будни обычно не до этого.

Там по моему так и сделано, машина создается для каждого скрипта, и она не уничтожается, отсюда и os.timer или как там его, не обнуляется.
Бетки по сборке сейчас слегка отменены, потому как автоматическое подписывание файла пилота не работает. Мне нужно его на другую винду нести, там подписывать, и сответственно нести обратно.

Автор: cirus 17.3.2017, 2:14

Не работают переменные hour, min, sec.

Автор: DarkMaster 17.3.2017, 15:42

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

а чего не грохать то? вот тебе и кнопка стопа будет норм и не надо в каждый оператор совать левые проверки и сам скрипт уродовать.

Автор: cirus 22.3.2017, 11:42

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

Автор: Cockney 22.3.2017, 14:03

Код
if not (state) then
//body
end

Автор: cirus 22.3.2017, 14:54

Если бы оно еще работало так.

Код
if not 1 == 2 then
    log (1)
end

Автор: Cockney 22.3.2017, 15:14

а со скобочками в учловии? после not

хоть это и не важно,но мало-ли

Автор: cirus 22.3.2017, 15:31

Цитата
а со скобочками в учловии? после not

Нет. Похоже что не работает.

Автор: Cockney 22.3.2017, 17:24

Цитата(cirus @ 22.3.2017, 15:31) *

Нет. Похоже что не работает.



Так выводит

Код
if (not (1 == 2)) then
    log (1)
end

Автор: cirus 23.3.2017, 2:05

Ну хоть так smile.gif

Автор: cirus 5.4.2017, 2:14

Код
--lua
a = 10.3 - 5.4
log (a)

b = 10.345 + 3.67
log (b)

В логе:
Код
4,90
14,02

Десятичный разделитель в логе запятая вместо точки.
Как-то можно избавиться от округления до двух знаков после точки?

Автор: DarkMaster 5.4.2017, 3:03

Цитата
Десятичный разделитель в логе запятая вместо точки.

Скорее всего кретинические стандарты русской локали. Я хз какой дебил придумал стандартизировать запятую.

Автор: Cockney 5.4.2017, 11:01

А запятае так критична ? Он же и с запятой все рассчитывает.

Автор: cirus 5.4.2017, 13:30

Может и не критично, получается пишешь точку, в результате запятая.
Так должно быть?:

Код
--lua
log ("mode compact")
s = 10.3 - 5.4
log (s)

s = tostring(10.3 - 5.4)
log (s)

s = tostring(10.3578 - 5.443)
log (s)

Лог:
Код
4,90
4.9
4.9148

Автор: DarkMaster 6.4.2017, 0:04

разница в том, что log() при выводе в лог делает свой внутренний дельфийский tostring() и он при конвертации использует настройки локали. Когда же ты делаешь tostring() в луа, то там не используются настройки локали. Это две разные функции на двух разных языках, две реализации одной задачи. Они просто работают чуть по разному. В текущей ситуации имхо лучше не обращаться к локали, чем обращаться к этому бреду.

Автор: FREEON 6.4.2017, 1:09

Похоже на то что вы между собой на марсианском разговариваете blink.gif laugh.gif

Автор: Cockney 6.4.2017, 14:26

Код
os.setlocale()


В луа используется си-локаль, в делфи системная. Только из пилота у меня так и не вышло установить нужную.


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

Цитата
при выводе в лог делает свой внутренний дельфийский tostring()


Спорно. Скорее всего лог принимает уже готовую строку, которую вернул луа. Т.к. формат переменных в делфи и луа может быть разный, легче передавать pchar.

Автор: WKnight 6.4.2017, 18:57

Луа возвращает double, но лог принимает уже готовую строку, которую конвертирует и обрезает прослойка.
Округление до двух знаков после точки починил.
С запятой сложнее.

Автор: DarkMaster 6.4.2017, 20:03

Цитата
В луа используется си-локаль, в делфи системная.

Си-локаль? Это как? Вообще в плюсах при русской локали точно так же вылазит запятая.

Автор: Cockney 6.4.2017, 21:14

Цитата(DarkMaster @ 6.4.2017, 20:03) *

Си-локаль? Это как? Вообще в плюсах при русской локали точно так же вылазит запятая.



Это локаль для работы Си программ. Именно Си. И программе, которая юзает такую локаль, плевать на рег. настройки. В с++ используются другие механизмы, на сколько знаю.

Автор: DarkMaster 7.4.2017, 0:11

Цитата
Это локаль для работы Си программ. Именно Си. И программе, которая юзает такую локаль, плевать на рег. настройки. В с++ используются другие механизмы, на сколько знаю.

Там вручную устанавливается локаль, и если ты вставишь русскую локаль - у тебя будет та же самая запятая. При этом нужно понимать, что не все функции ее учитывают. Есть специально написанные дабл->стринг и стринг->дабл, которые учитывают возможное появление запятой и принудительно ставят точку. Искал в свое время. Более того скажу, что в сях при разной включенной раскладке можно начать получать разный результат на выводе. Т.е. я ставил русскую локаль и при этом если в пилоте была англ раскладка включена, то получал точку, а если русская, то получал запятую. Понимаешь, почему в итоге я использовал сторонние функции? Реализация локалей спорная, а стандарт русской локали глубоко ошибочен.

Автор: DarkMaster 8.4.2017, 10:09

как прилинковывать в случае пилота дллки луашные?
http://w3.impa.br/~diego/software/luasocket/installation.html
нативно не получилось.

Автор: Cockney 9.4.2017, 12:32

Цитата
Там вручную устанавливается локаль



Где там ?

Цитата
если ты вставишь русскую локаль - у тебя будет та же самая запятая


Код
setlocale(LC_NUMERIC, "ru_RU.UTF-8");
printf("%1.3f", 2.645);


Выводит с точкой

Код
setlocale(LC_NUMERIC, "");
printf("%1.3f", 2.645);


С запятой.

Код
printf("%1.3f", 2.645);


Выводит с точкой. Без setlocale.

Если отказаться от си-функций

Код
std::cout << 2.64 << std::endl;


Выводит с точкой в независимости от того был ли вызов setlocale или нет.

Если же ты имеешь в виду класс locale, то он не работает для printf. Объект такого класса нужно привязывать к потокам и/о.


П.С. хочу еще заметить, что играет роль кодировка исходников, т.к. компилятор явно ( setlocale(LC_NUMERIC, "") ) и не явно задает локаль для функций, основываясь на кодировке исходника. У меня такая : Unicode (UTF-8 with signature) - Codepage 65001, у тебя же скорее всего Codepage -1251.

Автор: DarkMaster 9.4.2017, 14:12

я юникод не юзал, а в рульном ASCII все делал)

Автор: cirus 25.4.2017, 13:34

Код
--lua
arr = {{}}
arr [1][1] = 20
arr [2][1] = 15

Что не так?

Автор: DarkMaster 25.4.2017, 20:40

Если в 2 словах, то ты объявил некоторый массив и первому элементу присвоил другой массив. Дело в том, что второму элементу не присвоен массив, соответственно прозрачно не дает использовать индекс. В неявном виде подобное преобразование не проходит. Присмотрись

Код
arr [1][1] = 20
arr [2] = 15
--arr [2][1] = 15
log (arr[1][1], arr[2])


Нужно просто предварительно присвоить элементу массив.
Код
arr = {{}}
arr [1][1] = 20
arr [2] ={}
arr [2][1] = 15
log (arr[1][1], arr[2][1])

Либо можно это делать специальным оператором:
Код
local t = {1, 2, 3, 4, 5}
table.insert(t, 6) -- добавляет элемент в конец массива. Теперь  t = {1, 2, 3, 4, 5, 6}
table.insert(t, 0, 1) -- вставляет элемент по индексу, сдвигая оставшиеся элементы массива. Теперь  t = {0, 1, 2, 3, 4, 5, 6}
table.remove(t, 3) -- удаляет из таблицы элемент по индексу 3 и сдвигает оставшиеся элементы. Теперь t = {0, 1, 3, 4, 5, 6}

Автор: cirus 26.4.2017, 2:39

В пилотовском варианте намного проще smile.gif

Код
--lua
arr = {}
arr [1] = 20
arr [2] = 15
table.sort(arr)
log (arr[1], arr[2])
--Тут всё понятно.

Как сортировать это?:
Код
--lua
arr = {}
arr [1] = {20, 10, 15}
arr [2] = {15, 5, 13}

Т. е. должно получится:
Код
arr [1] = {15, 5, 13}
arr [2] = {20, 10, 15}


Код
--lua
h, m , s = string.match("11:33:55", "(%d+):(%d+):(%d+)")
log (h, m , s)

Реально ли прикрутить регэкспы перл? В регулярках луа отсутствуют \d{3,5}, |, (?<=), (?=) и прочее. По сути они вообще какие-то урезанные.

Автор: DarkMaster 26.4.2017, 19:53

Цитата
Как сортировать это?:

table.sort (table [, comp])

Сортирует элементы таблицы в заданном порядке, внутри таблицы, начиная с table[1] и заканчивая table[n], где n – длина таблицы. Если параметр comp задан, то он должен быть функцией, которая для двух получаемых параметров возвращает true если первый из них меньше второго (т.о. not comp(a[i+1],a[i]) будет верно для любого i будет давать true после окончания сортировки). Если comp не задан, то вместо него будет использован стандартынй оператор Lua "<".

Алгоритм сортировки не стабилен; в том смысле, что равные элементы могут быть переставлены в процессе сортировки.

Цитата

Реально ли прикрутить регэкспы перл? В регулярках луа отсутствуют \d{3,5}, |, (?<=), (?=) и прочее. По сути они вообще какие-то урезанные.

можно попробовать линкануть либу, но я так и не понял как в пределах пилота это делать.

Автор: cirus 27.4.2017, 3:19

Справку по луа я читал и не одну, так что копипаст не поможет. От примеров больше пользы.


Автор: cirus 27.4.2017, 13:26

Можно ли сделать чтобы функция загружалась из тхт файла?
Т. е. вместо этого:

Код
function MyFunc()
    код функции
end

Загрузка функции из тхт файла.

Автор: Cockney 27.4.2017, 17:41

что-то типа

Код
require


но там много нюансов.

Автор: DarkMaster 27.4.2017, 18:04

Сортировка с учетом значений двух первых столбцов, третий игнорируется:

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

Код
--lua

function mySort(a,b)
        if  a[1] < b [1] then
            return true
        else
            if  a[1] == b [1] and a[2] < b [2] then
                return true
            end
        end
        return false
end

arr = {}
arr [1] = {20, 10, 15}
arr [2] = {15, 5, 13}
arr [3] = {15, 4, 13}

table.sort(arr, mySort)

log (table.concat(arr[1], ","), table.concat(arr[2], ","), table.concat(arr[3], ","))

так же можно использовать упрощенную запись типа:
Код
arr [1] = {20, 10, 15}
arr [2] = {15, 5, 13}
table.sort (arr, function (a, b) return (a[1] < b[1]) end)

Автор: DarkMaster 27.4.2017, 19:50

кстати весьма забавная фишка: передача функции в качестве параметра.

Код
--lua

function show(a,b)
    a(b)
end

str = "vrs"
show(log, str)

Автор: cirus 28.4.2017, 2:43

Цитата
Сортировка с учетом значений двух первых столбцов, третий игнорируется:

Спасибо за пример. Теперь понятно что к чему.

Автор: cirus 28.5.2017, 20:17

Цитата
А запятая так критична ? Он же и с запятой все рассчитывает.

Код
--lua
e = exp(1)
e = string.gsub(e, ",", ".")   -- замена запятой на точку, без этой строки ошибка
result = 12 * e
hint (result, e)   --  и опять запятая в переменной result

Т. е. после каждого вычисления подменять запятую это не совсем удобно.

Ещё вопрос:
Есть поле, допустим 5*5. Каждая точка имеет несколько параметров. Как лучше хранить все данные?

Автор: DarkMaster 29.5.2017, 2:47

Цитата
Есть поле, допустим 5*5. Каждая точка имеет несколько параметров. Как лучше хранить все данные?

Массив.

Автор: cirus 29.5.2017, 3:10

Цитата
Есть поле, допустим 5*5. Каждая точка имеет несколько параметров. Как лучше хранить все данные?

Цитата
Массив.

Очень информативно smile.gif
В пилотовском варианте:
Код
set %arr [1 1] 10 20 30
set %arr [1 2] 15 33 6
init_arr %tmp (1) %arr [1 2]    // костыль в виде временного массива
log %tmp [1 3]    // обратиться к параметру 3 2й точки.
end_script

Или же делать 3 массива 5*5, т. е. для каждого параметра свой массив.
На луа как-то удобнее можно сделать?



Автор: DarkMaster 29.5.2017, 15:11

в луа ты можешь сделать не только прямоугольник, но и кубик. Там вообще по большому счету все есть одно большое дерево и типы данных как угодно можно распределять. Тем не менее рекомендуется придерживаться индексации цифрами если важна производительность, если индексация идет именем, то это уже будет не массив, а хеш таблица и при переборе большого количества данных будут потери.
Т.е. в твоем случае делай массив 5*5 и каждому элементу массива присваивай либо еще один массив либо индексацию в виде имени добавляй.

Автор: DarkMaster 29.5.2017, 20:42

Пойми одну простую вещь: элемент массива может быть любым типом данных с любым уровнем вложенности, в т.ч. массивом, хештаблицей и т.д.

Автор: cirus 30.5.2017, 2:37

код
Код
--lua
log ("mode compact") log ("clear")
field = {}
z = 0

-- заполнение массива, для примера числами от 1 до 25
for i = 1, 5 do
     field [i] = {}
     for j = 1, 5 do
         z = z + 1
         field [i][j] = z
     end
end

-- вывод массива в лог
for i = 1, #field do
   log (unpack(field[i]))
end


field [1][1] = {100, 200, 300}   -- вариант 1
log (field [1][1][2])

--field [1][1] = {x=100, y=200, n=300}   -- вариант 2
--log (field[1][1].y)

Так должно быть?
Вариант 1 предпочтительнее в плане производительности?

Автор: DarkMaster 30.5.2017, 17:07

Цитата
Так должно быть?

Да.
Цитата
Вариант 1 предпочтительнее в плане производительности?

Да, но нужно понимать насколько это критично для конкретного случая.

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

Второй вариант будет содержать указатель на данные хранящиеся отдельно от непосредственно массива. Второй вариант может быть более производителен при присвоении строк, т.к. не будет требовать перестроения всего массива в момент присвоения, если строка не влазит. В этом варианте полная свобода по размеру данных в ячейке. Если мы пытаемся вставить элемент в середину массива, то это приводит к полному копированию "хвоста" массива, чтобы в середине образовалась дырка для наших данных. Указатели и хэш таблицы позволяют этого избежать, однако при переборе с большим количеством операций мы будем неизбежно проигрывать в производительности. Тут все достаточно очевидно на самом деле. Если у нас фиксированный массив, то интерпретатор вычисляет смещение от начала массива до нашей ячейки и получает данные, если хеш таблица, то интерпретатор вычисляет смещение от начала массива до нашей ячейки, считывает из нее указатель, получает данные по указателю. На один этап больше, дополнительное обращение к случайному участку памяти, как следствие снижение производительности.

// Кстати ты обратил внимание на то, что ты создаешь 2 мерный массив и присваиваешь ячейкам int значения, а потом вместа int присваиваешь массив? Вообще формально это допустимо, но выглядит дико.

Автор: cirus 31.5.2017, 2:16

Цитата
Кстати ты обратил внимание на то, что ты создаешь 2 мерный массив и присваиваешь ячейкам int значения, а потом вместа int присваиваешь массив? Вообще формально это допустимо, но выглядит дико.

Без понятия как оно должно быть. Как надо?

Автор: DarkMaster 31.5.2017, 11:36

Цитата
for j = 1, 5 do
z = z + 1
field [i][j] = z
end

вот это бы выкинуть просто. Я понимаю, что оно для отладки, но ты потом этот "номер" заменяешь на массив. Луа прекрасен своей гибкостью и он это позволяет, но, как я уже говорил, выглядит это дико. Просто всмотрись в код, ты делаешь:
z = z + 1
field [i][j] = z
а ниже идет
field [i][j] = {x=100, y=200, n=300}

формально твой код полностью корректен.

Автор: cirus 31.5.2017, 14:10

Помедитировав полчаса над тем что ты написал, дошло smile.gif

Автор: DarkMaster 31.5.2017, 14:15

Кстати подобные действия могут привести к падению производительности. Т.к. элемент содержал число(4 байта), а при присвоении массива там уже будет 12 байт(не влезет). Т.е. либо переформировываем массив, либо используем указатель и выносим данные из единого блока памяти.

Автор: cirus 11.6.2017, 16:18

Какой тип данных будет возвращать getlayout? Там же в некоторых раскладах есть буквы, т. е. сравнивать как строку?

Код
--lua
a = getlayout ()
hint (a)
if a == "00000409" then
    log ("+++++")
end

Такой вариант не работает. Или так нельзя сравнивать?

Автор: WKnight 11.6.2017, 18:26

build 4
Исправил возврат в Lua значений некоторых функций. Добавлялся пробел.

Автор: cirus 11.6.2017, 18:51

findcolor также возвращает строки. Или он ещё не правился?

Автор: WKnight 11.6.2017, 20:20

Так они почти все в принципе строки возвращают, просто getlayout возвращал "00000409 ".

Автор: cirus 11.6.2017, 21:38

Цитата
Так они почти все в принципе строки возвращают

Заметили, но это же не нормально для функций, которые должны возвращать число.

Автор: WKnight 12.6.2017, 19:22

Да, но пилотовским скриптам на это как бы фиолетово, поэтому об этом не думалось в момент написания.
Подозреваю, что можно внести некоторые коррективы, но как на это отреагирует луа, в уже готовых скриптах?

Автор: cirus 12.6.2017, 20:27

А что много скриптов на луа написано?

Код
if tonumber(color (100, 200)) == 0 then

Код
if color (100, 200) == "0" then

Логичнее же:
Код
if color (100, 200) == 0 then

Как по мне, то все функции, возвращающие только числа, должны возвращать числовой тип данных.

Что с переменными hour, min, sec? Можно конечно использовать os.date, но старые переменные более понятны.



Автор: cirus 12.6.2017, 21:59

Как в луа выходить из вложенных циклов?

Автор: Cockney 12.6.2017, 23:37

Как и в пилоте. Только break влияет только на цикл, в котором расположен.

Автор: cirus 13.6.2017, 0:37

Если бы как в пилоте break 2 и вышел. Тут же нет такого.

Автор: Cockney 13.6.2017, 1:24

Цитата
Только break влияет только на
цикл, в котором расположен.

Автор: cirus 13.6.2017, 10:50

Цитата
Только break влияет только на
цикл, в котором расположен.

Как работает брейк и как прервать текущий цикл понятно. Вопрос был не про это.
так должно быть?
Код
--lua
z, _break = 0, 0
for i = 1, 3 do
    for j = 1, 3 do
        for k = 1, 3 do
            z = z + 1
            if z == 14 then            -- если z равно 14 выйти из всех циклов
                _break = 1            
                break
            end
        end
        if _break == 1 then break end
    end
    if _break == 1 then break end
end
hint (z)

Автор: Cockney 13.6.2017, 17:42

Ну если работает, то наверно так.

Автор: cirus 14.6.2017, 2:51

Код
--lua
h = findwindow ("UoPilot")
printscreen (h[1][1], 0, 0, 0, 0, [[C:\window4.jpg]])

Всё работает, только отображается что скрипт запущен.
Прикрепленное изображение

Автор: cirus 14.6.2017, 12:22

Код
--lua
log (111)
log (222)

Номер исполняемой строки 0.
Код
12:19:36 9 (autosaved_9.txt, 0): 111
12:19:36 9 (autosaved_9.txt, 0): 222


Автор: cirus 15.6.2017, 11:38

Код
--lua
log ("C:\Users")
log ('C:\Users')
log ([[C:\Users]])

Так и должно быть? При использовании " " и ' ' пропадает слеш.

Автор: Cockney 15.6.2017, 11:43

а если вставить два слеша? с:\\

эскейп-последовательность,наверное. Первый символ после \ считается специальным,а если это не так, то этот символ просто остается на месте,при этом удаляется предыдущий слэш.

Автор: cirus 15.6.2017, 11:52

Цитата
а если вставить два слеша? с:\\

С двумя остаётся один.

Автор: cirus 7.8.2017, 1:31

Код
--lua
a = -5^2
hint (a)

Вместо 25 выдаёт -25.

Автор: DarkMaster 15.8.2017, 10:18

Цитата
Вместо 25 выдаёт -25.

И абсолютно верно выдает хочу заметить. Есть порядок действий, который мы все в школе проходили. Возведение в степень производится перед вычитанием. Попробуй взять число в скобки. Тут нужно понимать, что у числа в данном случае не знака, а минус является исключительно операцией.

Автор: Cockney 15.8.2017, 12:30

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


имел в виду отличие знаковых чисел от операций без скобок.

Автор: cirus 15.8.2017, 12:39

Цитата
Попробуй взять число в скобки.

Пробовал.
Код
--lua
a = 20 + -2^2
c = 20 + (-2^2)
log (a, c)   -- 16 в обоих случаях


Автор: Cockney 15.8.2017, 12:56

вот так :

Код
(-2)^2

Автор: cirus 15.8.2017, 13:14

Цитата
вот так :
Код
(-2)^2

Теперь понятно.

Автор: DarkMaster 29.8.2017, 16:03

Код
    min2 = findimage ("900, 17 980, 50 (Scripts\Crossout\images\02_00.bmp) %vrs workwindow 80 1 10")
    log (min2)

-4
Код
    set #vrs findimage (900, 17 980, 50 (Scripts\Crossout\images\02_00.bmp) %vrs workwindow 80 1 10)
    log #vrs

ищет, если есть находит.

Что не так?

Автор: WKnight 29.8.2017, 18:30

Может слэши в пути?

Автор: DarkMaster 29.8.2017, 18:37

крутил в обе стороны. причем доводил уже до абсурда h:\1.
Ааа мялть. Экранирование. Ескейп последовательность.

Да... Дело привычки... '\' - надо писать два раза.

Автор: DarkMaster 3.9.2017, 9:38

linedelay = 0
Global const "linedelay" can not be changed.

Автор: DarkMaster 3.9.2017, 9:52

end_script ()
Global variable "end_script" not found.

send ("{Backspace}")
флуд в лог
"Function key: Backspace "

Автор: WKnight 4.9.2017, 19:33

Цитата
linedelay = 0
Задержка между строк в скрипте, не действует на скрипты луа.
Цитата
end_script ()
У луа свой метод прерывания скрипта. Когда доделаю перезапуск машины луа, тогда ченить придумаем с этой командой.
Цитата
"Function key: Backspace "
Флудит только в девелоперской версии. Для отладки.

Автор: DarkMaster 5.9.2017, 20:18

Цитата
Когда доделаю перезапуск машины луа

А когда? Очень забавно области видимости менять у переменных и одуревать)

Автор: WKnight 6.9.2017, 12:19

Цитата
Вообще на луа надо написать, но в нём не работали getimage и loadimage.
Они как бы работают, но это не совсем очевидно

Код

--lua
set ("%a1 [1] GetImage  ( 500 500 1140 1140")
s = "%a1 [1 1]"
saveimage (s, "c:\\temp\\test.bmp")
set ("%a2 [1] loadimage (c:\\temp\\test.bmp)")
ss = "%a2 [1 1]"
saveimage (ss, "c:\\temp\\test2.bmp")

Автор: cirus 6.9.2017, 12:30

Цитата
это не совсем очевидно

Это совсем не очевидно. Даже не костыль, а инвалидная коляска smile.gif

Автор: WKnight 6.9.2017, 12:34

Я в данном случае ничего в коде не делал, только проверил.
Сами команды работают. Нужно придумать как результат от них забирать попроще.

Автор: WKnight 6.9.2017, 13:04

Код
--lua
s = getimage ( 500, 500, 1140, 1140)
saveimage (s, "c:\\temp\\test.bmp")
ss = loadimage ("c:\\temp\\test.bmp")
saveimage (ss, "c:\\temp\\test2.bmp")


Автор: cirus 6.9.2017, 13:16

Код
s = getimage ( 500, 500, 1140, 1140)
ss = loadimage ("c:\\temp\\test.bmp")

Возвращать 4 параметра.
Код
address, width, height, length = getimage ( 500, 500, 1140, 1140)


P.S. Перенесите в тему lua ответы не относящиеся к скрипту.

Автор: cirus 7.9.2017, 12:00

исправить Dir и Regexp

Код
resultarray = dir ([Path [Filemask]])
position, hitstring = regexp (string, regexp)

Автор: DarkMaster 10.9.2017, 6:39

Сохранение таблиц в файл находили? Кучу функций пользовательских перебрал - одна хуже другой. То типы данных не держут, то вложенные таблицы, то большие таблицы, то сохраненная таблица абсолютно не читабильна. Что-нибудь бы типа:

Код
LunaDB = {
    ["profiles"] = {
        ["Default"] = {
            ["bgcolor"] = {
                ["b"] = 0.07058823529411765,
                ["g"] = 0.07058823529411765,
                ["r"] = 0.07058823529411765,
            },
            ["bgalpha"] = 0.01,
            ["healthColors"] = {
                ["static"] = {
                    ["b"] = 0.8941176470588235,
                    ["g"] = 0.8980392156862745,
                    ["r"] = 0.8901960784313725,
                },
            },

Автор: Cockney 10.9.2017, 12:04

http://lua-users.org/wiki/TableSerialization

Автор: DarkMaster 10.9.2017, 22:25

вызов dir не ясен. В прозрачном виде не вызвался,
set ("dir(%dirList "..options.path..options.ext..')"')
s = "%dirList[1][1]"
log(s)
тоже не захотело.

Автор: WKnight 10.9.2017, 23:35

build 9

Изменен синтаксис команды 'dir' при вызове из Lua. 'resultarray = dir ([Path [Filemask]])'

Автор: DarkMaster 10.9.2017, 23:42

вот это оперативность =)

Автор: DarkMaster 11.9.2017, 0:17

А не пашет. Есть подозрение, что ты билд не залил.

Код
--lua
do
    local tab = ""
    function table.show(t)
        if     type(t) == "nil"     then log("table is nil")
        elseif type(t) == "string"  then log('table is string: "'..t..'"')
        elseif type(t) == "number"  then log('table is number: '..t)
        elseif type(t) == "table"   then
            for k,v in pairs(t) do
                if  type (v) == "table" then
                    log(tab.."table: "..k)
                    tab = tab .. "    "
                    table.show(v)
                    tab = string.sub(tab, 1, -5)
                else
                    if type(v) == "string" then v = '"'..v..'"' end
                    if type(k) == "string" then k = '"'..k..'"' end
                    log(tab..""..k.." = "..v)
                end
            end
        else
            log('table is unknow data type')
        end
    end
end

dl = dir("c:\\")

table.show(dl)

Автор: DarkMaster 11.9.2017, 2:39

Кнайт, я вижу, как меняются ночные билды, но оно не работает)

Автор: DarkMaster 11.9.2017, 7:26

loadimage возвращает коды ошибок в виде стринга.

Автор: WKnight 11.9.2017, 18:12

Это в девятом билде, я не заливал его еще, вчера уже падал спать.

Цитата
loadimage возвращает коды ошибок в виде стринга.

От него как бы обычно строку ждут, а если он вместо нее число вернет, луа по-моему упадет.

Автор: DarkMaster 11.9.2017, 19:50

Цитата
От него как бы обычно строку ждут, а если он вместо нее число вернет, луа по-моему упадет

А с чего ему падать то? Адреса кстати возвращаются не стрингом, а числом и ничего не падает smile.gif

Автор: WKnight 11.9.2017, 20:30

Переделал.

Автор: DarkMaster 11.9.2017, 22:29

dl = dir("c:\\")
понял, что это надолго и нажал стоп скрипта. Пилот закрылся.

Тикет оказался актуальным:
table: 11
1 = "i:\!sandboxie\Crossout\drive\I\Crossout\bin\win64\steam_api64.dll"
2 = "i:\!sandboxie\Crossout\drive\I\Crossout\bin\win64\"
3 = "steam_api64"
4 = ".dll"
5 = "235600"
6 = "A"
7 = "01.12.2016"
8 = "0:51:52"
9 = "0"
table: 12
1 = "i:\!sandboxie\Crossout\drive\I\Crossout\bin\win64\xinput1_3.dll"
2 = "i:\!sandboxie\Crossout\drive\I\Crossout\bin\win64\"
3 = "xinput1_3"
4 = ".dll"
5 = "107368"
6 = "A"
7 = "18.04.2017"
8 = "20:18:24"
9 = "0"

Автор: DarkMaster 11.9.2017, 23:33

Кстати обрати внимание на поля. Опять лишние стринги smile.gif

Автор: DarkMaster 12.9.2017, 11:26

Кнайт, у тебя плагины не отвалились? Опять сокеты ни в какую не могу завести... И дллки перекачивал, поставляемая с сокетом не захотела работать с пилотом(машина не стартанула с ней).

Автор: WKnight 12.9.2017, 18:33

18:28:48 91 (autosaved_91.txt, 0): LuaSocket 2.0.2
18:28:50 91 (autosaved_91.txt, 0): 1 200 LuaTable HTTP/1.1 200 OK

Автор: DarkMaster 13.9.2017, 2:42

Пилот:

socket = require("socket")
log(socket._VERSION)
>LuaSocket 2.0.2

http = require("socket.http")
log(socket._VERSION)
>nil

socket = require("socket")
http = require("socket.http")
log(socket._VERSION)
>nil

http = require("socket.http")
socket = require("socket")
log(socket._VERSION)
>LuaSocket 2.0.2


Берем консоль поставляемую с плагином - проблем нет в любом сочетании, запросы шлет. Тут версии нет, запросы слать не пытается.

Автор: WKnight 13.9.2017, 18:14

После "require("socket.http")", "socket._VERSION" почему то перестает существовать, но запросы посылает. Проверял на шестой бете. Ведет себя точно так же как сейчас.

Код

--lua
socket = require("socket")
log(socket._VERSION)
local http = require("socket.http")
log(http.request{
    url = "http://uopilot.uokit.com/index_rus.php",
})

Автор: DarkMaster 14.9.2017, 15:05

Код
                tmp = {}
                findResult = findimage(
                    options.crds[1] .. " " .. options.crds[2] .. " " ..
                    options.crds[3] .. " " .. options.crds[4] .. " " ..
                    "(" .. options.path .. symbolName .. options.ext .. ") " ..
                    "%tmp " .. screenshot .. " " .. options.accuracy .. " -1 " .. options.deviation)
                --log("symoblName: ".. symbolName .. " findResult: " .. findResult)
                -- проверяем на возрват нуля или ошбики, со стрингом нормально не сравнить.
                if  findResult ~= "0" and string.find (findResult, "-") then
                    -- Напрямую вернуть таблицу в функцию нельзя из-за синтаксиса.
                    table.insert(crds,tmp)
                end

Кнайт, это просто вызов финдимиджа и проверка на < 1. Можно как-то поближе к реалиям? Параметры не через дикий стринг, результат тоже кстати приходит стрингом. Так же обрати внимание на таблицу - вроде бы приходит таблицей, но не исключаю, что и номера строк заданы стрингом и по сути это не массив, а таблица, тогда нарушается порядок нахождения изображений слева направо сверху вниз, т.к. таблица хранится не по порядку в отличии от массива. Результат нельзя вернуть в функцию, так же его нельзя вернуть во вложенный массив, например image.crds уже не даст никак.

При выбивании ошибки луа, она отображается за окном пилота, если он поверх всех окон - задалбывает еще больше, чем закрытие пилота после каждой остановки скрипта smile.gif

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

Автор: DarkMaster 14.9.2017, 17:10

Кнайт, давай сделаем доп колонку в массиве от финдимиджа с процентом совпадения? Количество элементов в луа не актуально, т.к. #массив - вернет размер.

Автор: DarkMaster 18.9.2017, 12:37

Код
crdsClear={{y=56,x=50,symbolName=3,},
{y=56,x=29,symbolName=2,},
{y=56,x=99,symbolName=2,},
{y=56,x=9,symbolName=5,},
{y=56,x=69,symbolName=5,},
{y=56,x=19,symbolName=4,},
{y=56,x=59,symbolName=4,},
{y=56,x=89,symbolName=4,},
{y=56,x=40,symbolName=7,},
{y=56,x=80,symbolName=6,},}



tmp2={}
ywf = 1
table.sort(crdsClear,
    function(a,b)
        tmp2[ywf]=""
        for i=1, #crdsClear, 1 do tmp2[ywf] = tmp2[ywf].."\t"..crdsClear[i].x end
        ywf = ywf + 1
        if  a.x <= b.x then log(a.x.." <= "..b.x.." true") else log(a.x.." <= "..b.x.." false") end
        return a.x <= b.x --  a.y <= b.y and
    end
)

-- Собираем строку
order=""
log(#crdsClear)
result = {[1]=""}
for i=1, #crdsClear, 1 do
    order = order..crdsClear[i].x.." "
    result[1] = result[1].. crdsClear[i].symbolName
end
log(order)
log(result[1])

Table.sort дает странный результат при <=
если поменять:
return a.x <= b.x
на:
return a.x < b.x
то порядок приходит в норму. В чем проблема?

Автор: cirus 18.9.2017, 14:17

Непонятно какая там сортировка используется, вообще так получается:

Код
-- от меньшего к большему
if  a.x < b.x then return true else return false end
if  a.x >= b.x then return false else return true end  -- или так

-- от большего к меньшему
if  a.x <= b.x then return false else return true end
if  a.x > b.x then return true else return false end   -- или так

Автор: DarkMaster 18.9.2017, 15:03

Ситуация в целом дикая. Какое вообще дело оператору сортировки, как я получаю значение истина/ложь? Он вообще ничего этого не может видеть. Более того я разложил на < и = ифами, те же самые проблемы.

Автор: cirus 18.9.2017, 15:42

50 < 50 - false
50 <= 50 - true
Логично что результат разный.

Автор: DarkMaster 18.9.2017, 17:00

Цитата
50 < 50 - false
50 <= 50 - true
Логично что результат разный.

19 < 29
19 <= 29
Результат разный. Что логичного? Там нет одинаковых значений которые могли бы в итоге выдать разный результат, присмотрись к объявлению массива.

Автор: DarkMaster 18.9.2017, 17:39

return not (a.x > b.x)
тоже бред возвращает. Тут что логичного?

Автор: cirus 19.9.2017, 2:16

Цитата
Там нет одинаковых значений которые могли бы в итоге выдать разный результат

log
Код
80 <= 50 false
69 <= 50 false
80 <= 69 false
29 <= 69 true
99 <= 69 false
69 <= 89 true
69 <= 59 false
9 <= 69 true
40 <= 69 true
19 <= 69 true
99 <= 69 false
69 <= 19 false
80 <= 89 true
99 <= 80 false
89 <= 99 true
19 <= 50 true
59 <= 19 false
50 <= 59 true
29 <= 50 true
40 <= 50 true
9 <= 50 true
50 <= 50 true
59 <= 50 false
50 <= 9 false
59 <= 19 false
40 <= 19 false
59 <= 40 false
29 <= 40 true
9 <= 40 true
40 <= 40 true
59 <= 40 false
40 <= 9 false
59 <= 19 false
29 <= 19 false
59 <= 29 false
9 <= 29 true
29 <= 29 true
59 <= 29 false
29 <= 9 false
59 <= 19 false
9 <= 19 true
10
9 19 59 29 40 50 69 80 89 99
5442735642

22 строка: 50 <= 50 true. Хз как оно сортируется.
Из описания функции: Если параметр comp задан, то он должен быть функцией, которая для двух получаемых параметров возвращает true если первый из них меньше второго.
По сути этим всё сказано, меньше, а не меньше или равно.
Цитата
return not (a.x > b.x)
тоже бред возвращает. Тут что логичного?

Дело не в логике, а принципе сортировки.
Код
return not (a.x >= b.x)

Автор: DarkMaster 19.9.2017, 4:04

Цитата
Sorts list elements in a given order, in-place, from list[1] to list[#list]. If comp is given, then it must be a function that receives two list elements and returns true when the first element must come before the second in the final order (so that, after the sort, i < j implies not comp(list[j],list[i])).

Там вообще речи даже не идет про меньше или больше. Функция должна возвращать правду когда первый элемент должен идти перед вторым в финальном порядке.
Более того не понимая принцип данного поведения невозможно без опасений использовать оператор, особенно при ветвистых условиях сортировки. Тут ведь дело даже не в =>, при разложении на:
Код
if  val1 > val2 then
    return false
else
    return true
end

Мы тоже получим ошибку. Конструкция то примитивнейшая, а поведение отнюдь не ожидаемое.

Автор: Cockney 19.9.2017, 18:01

И что это ?

пс : инглиш продвинутого уровня )

Автор: DarkMaster 19.9.2017, 18:31

В последней ночной сборке как раз переделывался запуск виртуальной машины. Теперь она гасится при остановке скрипта. Хотелось бы понять, как получилось вызвать данную ошибку.

Автор: Cockney 19.9.2017, 18:38

запуск скрипта. все. первый раз.

Автор: DarkMaster 19.9.2017, 19:09

Что за скрипт? Я вообще на ночной сижу, тестирую, пишу.

Автор: Cockney 19.9.2017, 19:31

подключение самописного модуля через require

Автор: DarkMaster 19.9.2017, 21:09

Цитата
подключение самописного модуля через require

Cockney, ну ты же большой мальчик. Нужно воспроизведение проблемы smile.gif

Автор: Cockney 19.9.2017, 21:38

Так что я отправлю ? Кладу длл модуль свой в папку с пилотом. Пилот запустил. Запускаю скрипт, и ВАЖНЫЙ МОМЕНТ, мой модуль не при чем, т.к. я оставил в скрипте только log(). Получаю сообщение, отправленное выше, дальше вываливается AV. Все.

Автор: DarkMaster 20.9.2017, 8:58

Дллка луашная местная или сторонняя?

Автор: Cockney 20.9.2017, 11:20

Разные пробовал. И со страницы кнайта и с репозитория луа.

Автор: DarkMaster 20.9.2017, 11:57

Извиняюсь за тупой вопрос, но запускал от админа?

Автор: Cockney 20.9.2017, 16:59

Да.

Автор: Cockney 20.9.2017, 21:12

Кстати, на 10 работает, а на 7 нет.

Автор: DarkMaster 21.9.2017, 0:05

битность? У меня 7х64 все ок.

Автор: Cockney 21.9.2017, 6:09

И то и то 64.

Автор: DarkMaster 21.9.2017, 16:59

dir работает? Если указываю корень диска - все ок, как только указываю путь, то начинаются проблемы... Слэши удваивал.

Автор: DarkMaster 24.9.2017, 10:15

Код
log("Укажите левый верхний угол изображения и нажмите Ctrl+A")
workwindow = 0
while workwindow == 0 do
    wait(10)
end

В луа не работает, т.к. workwindow не обновляется по Ctrl+A.

Автор: DarkMaster 24.9.2017, 10:30

writemem заставить работать так и не получилось...

Автор: DarkMaster 24.9.2017, 11:11

Код
while timeout > time and timeoutHard > time do
    newImage = getimage(x1, y1, x2, y2, workwindow)
    saveimage(staticImage, "d:\\test.bmp")
    saveimage(newImage, "d:\\test2.bmp")
    log("получили изображение: "..newImage)

    for i=staticImage, bitmapEnd, 1 do
        lc = readmem(i.." b")
        nc = readmem(newImage.." b")
        log("цвета: "..lc.." "..nc.." адреса:"..i.." "..newImage)
        newImage = newImage + 1
        --if lc ~= nc then log("пишем в память") set ('writemem (0xff, '..i..', "b")') end
    end
end

вернулся полный бред. То нули пишет, то -1, то какие-то значения.

Автор: cirus 24.9.2017, 12:04

Цитата
вернулся полный бред. То нули пишет, то -1, то какие-то значения.

Это из-за косяков с привязкой.
Перед
Код
for i=staticImage, bitmapEnd, 1 do
        lc = readmem(i.." b")

Нужно делать привязку к пилоту, по идее worwindow = windowhandle(), но так не хочет работать.
Работает только если скрипт изначально привязан к пилоту через Ctrl + A.
Код
--lua
-- Скрипт привязан к пилоту, тогда работает как надо
h = findwindow("II")
if h[1] then
    a = getimage (238, 42 , 259, 93, h[1][1])
    for i = 0, 10 do
        lc = readmem(a + i .." b")
        log (lc)
    end
end



Автор: DarkMaster 24.9.2017, 17:34

Код
count = dir ([Path [Filemask]] [norecursion])

не дает задать конструкцию:
Код
count = dir (path, nil, flag)

Т.е. при задании флага рекурсии требует обязательное указание маски. Подозреваю, что это наследие пилотовского синтаксиса и конвертации параметров в строку. Зато позволяет задать маску в имени файла:
Код
options.symbolsDir = {
    path="i:\\!sandboxie\\Crossout\\drive\\I\\Crossout\\bin\\ *exe ",
    mask=nil,
    sub=0
    }

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

Автор: cirus 24.9.2017, 18:00

Цитата
получаем баги с невозможностью получить список файлов, если в пути содержится пробел - все, что после пробела просто улетает в маску.

Или указывать путь в кавычках, как временное решение.
Код
path='"i:\\!sandboxie\\Crossout\\drive\\I\\Crossout\\bin\\" "*exe "'





Автор: DarkMaster 24.9.2017, 18:06

Дополнительное обертывание пути в кавычки позволяет использовать адреса содержащие пробелы, однако маску равную nil все равно принимать отказывается.

Код
options.symbolsDir.path = '"'..options.symbolsDir.path..'"'


Цитата
path='"i:\\!sandboxie\\Crossout\\drive\\I\\Crossout\\bin\\" "*exe "'

Кхе пока писал - уже твой пост прилетел.
Маску в путь я бы все-таки не пихал. Она вполне нормально работает отдельным параметром. Просто не следует передавать ее равной nil.

Автор: cirus 24.9.2017, 18:25

Цитата
Дополнительное обертывание пути в кавычки позволяет использовать адреса содержащие пробелы

Или использовать string.format.
Код
str = [[C:\Users\abc\Desktop\123.txt]]
log (string.format("%q", str))  -- вернёт строку в двойных кавычках, \ будут заменены на \\
str2 = "C:\\Users\\abc\\Desktop\\123.txt"
log (string.format("%q", str2))  -- вернёт строку в двойных кавычках


Автор: DarkMaster 26.9.2017, 16:07

table.unpack() не пашет. Типа анпака нет. В 5.1 должен быть еще просто unpack(), но его тоже нет. Привет кристаллуа?

Автор: cirus 27.9.2017, 2:03

Цитата
В 5.1 должен быть еще просто unpack(), но его тоже нет.

http://uopilot.tati.pro/index.php?title=Unpack_(Lua)

Автор: DarkMaster 27.9.2017, 11:02

эмм.. у меня просто орет, что его не существует....

Автор: DarkMaster 3.10.2017, 6:52

В чем прикол?

Код
function t (options)
   log(options)
end
t{crds={1,2,3,4}}


Код
t={}
function t.f (options)
   log(options)
end
t.f(123)


Не работает:
Код
t={}
function t.f (options)
   log(options)
end
t.f{crds={1,2,3,4}}


Работает:
Код
t={}
function t.f (options)
   log(options)
end
t:f{crds={1,2,3,4}}

В чем фишка? Вообще насколько я понял : передает в качестве параметра саму же функцию. Как связаны эти проблемы убей не пойму.

Автор: DarkMaster 3.10.2017, 7:58

В интерпретаторе таблицу возвращает, там где пилот nil. Что за бред? Или это только у меня, как с unpack?

Автор: DarkMaster 3.10.2017, 19:54

Неужели никаких идей? Хотя бы воспроизводится у вас?

Автор: cirus 4.10.2017, 2:08

Для меня это тёмный лес, знаний нет.

Цитата
--Не работает:
t={}
function t.f (options)
log(options)
end
t.f{crds={1,2,3,4}}

Типа так должно быть?
Код
--lua
t={}
function t.f(options)
   log(options)
end
t.f( {crds={1,2,3,4}} )



Автор: DarkMaster 4.10.2017, 2:37

Список допустимых упрощенных записей:

Цитата
Код
  f{...}             f({...})
  f('...')           f'...'
  f("")              f""
  f([[...]])         f[[...]]
  x:f(...)           x.f(x, ...)

Так же хочу обратить внимание, что подобная упрощенная запись нормально воспринимается при:
function f(options)
но не воспринимается при:
f = {}
function f.v (options)

Если этот код запихать в интерпретатор луа - все работает. Беру дллку от этого интерпретатора, засовываю в пилот не работает. Ничего не понимаю.

Автор: DarkMaster 4.10.2017, 5:48

Цирк продолжается:

Код
function print(val)
    log(val)
end

function g (v)
    if v == nil then v = 0 end
    return 100 + v
end

do
    local default = {}
    default.crds = function (b) print(b) return g(b) end
    function f (b)
        return default.crds(b)
    end
end
print(f(3))

Орет про то, что данные переданы таблицей. Таблицы там нет и в помине. При этом мой table.show даже развернуть ее не смог ибо там какой-то бред.

Берем этот же самый код и пихаем в интерпретатор луа - все шуршит.

Если функцию объявлять, как:
Код
function default.crds (b)

то все опять начинает работать.

Открываем любой справочник, маны, доки. Функция является базовым типом и запись полностью корректна.
-- Functions are first-class, may be local/global.
-- These are the same:
function f(x) return x * x end
f = function (x) return x * x end

Автор: DarkMaster 4.10.2017, 6:22

Продолжаем развлекаться:

Код
    default = {}
    function default.crds (window)
        get ("windowpos ".. window .. " #x #y #w #h")
        x, y, w, h = "#x", "#y", "#w", "#h"
        log (x, y, w, h, 197)
        return {x, y, w, h, abs=0}
    end

    options = {}
    options.crds = default.crds("workwindow")
    table.show(options.crds)
    log(options.crds[1])

Вывод в лог просто не может оставить равнодушным. Полная солянка из значений, имен переменных.
При этом:
options.crds[1] = options.crds[1] + 1
выбьет ошибку, что производятся арифметические действия со стрингом
options.crds[1] = tonumber(options.crds[1]) + 1
сообщит, что арифметические действия производятся с nil. Видимо tonumber() так же в options.crds[1] видит не значение, а имя переменной и соответственно возвращает nil.

Автор: cirus 4.10.2017, 15:41

А ничего что первый символ # smile.gif

Код
--lua
get ("windowpos ".. workwindow .. " #x #y #w #h")
x, y, w, h = "#x", "#y", "#w", "#h"
log (x.byte(), y.byte())

Автор: DarkMaster 4.10.2017, 19:27

Цитата
А ничего что первый символ # smile.gif

Так а что он там делает?

Автор: cirus 5.10.2017, 2:10

Цитата
Так а что он там делает?

Не происходит присваивания значения переменной, присваивается имя.
Код
x = "#x"

Т. е. x - это строка, содержащая #x (по сути текст), а не значение #x. Поэтому не возможны арифметические операции, перевод в число через tonumber. Оттуда же и nil, т. к. #x нельзя перевести в число.
Каким образом лог выводит число не совсем понятно.

код
Код
--lua
function print(val)
    log(val)
end

function g (v)
    if v == nil then v = 0 end
    return 100 + v
end

do
    local default = {}
    default.crds = function (b) print(b) return g(b) end
    function f (b)
        return default["crds"](b)      -- вместо default.crds(b) тогда работает
    end
end
print(f(3))

Автор: DarkMaster 5.10.2017, 9:18

cirus, сделай чудо? writemem бы заставить работать. Я уже какими окольными не придумывал - не выходит...

getimage возвращает размер и lenght. Что есть lenght? Сначала думал размер в байтах. Оказалось, что lenght всегда равен или больше длина * 3. При этом больше не более чем на 3 байта. Это выравнивание или что?

Автор: cirus 5.10.2017, 11:56

Цитата
writemem бы заставить работать.

Пробовал уже, не получилось.
Цитата
getimage возвращает размер и lenght. Что есть lenght? Сначала думал размер в байтах. Оказалось, что lenght всегда равен или больше длина * 3. При этом больше не более чем на 3 байта. Это выравнивание или что?

Да, это длина строки в байтах с выравниваем.
Код
length = width * 3 + width % 4

Автор: DarkMaster 6.10.2017, 10:07

Цитата
И что это ?

пс : инглиш продвинутого уровня )

Получил точно тот же еррор когда попытался подсунуть LuaJIT, а так же когда потом криво переименовывал.
В дллках точно уверен?

Автор: Cockney 6.10.2017, 11:27

В каких именно ? Самого луа ? Качал с сайта кнайта. Не работает. Собирал сам. Не работает. Длл плагина не причем, т.к. скрипт не может запуститься из-за краша.

На вин 10 работает. На 7 ни в какую. Обе х64. Оба админы.

Автор: DarkMaster 7.10.2017, 2:27

Цитата
Длл плагина не причем, т.к. скрипт не может запуститься из-за краша.

Там не скрипт не запускается, а машина. При кривой длл получаешь точно ту же ошибку.

Автор: Cockney 7.10.2017, 12:50

Ну к длл-плагину это не относится. Он же не загружается.

Автор: DarkMaster 7.10.2017, 13:17

Цитата
Ну к длл-плагину это не относится. Он же не загружается

это относится к длл луа. краш происходит ДО попытки выполнить скрипт. А если быть точнее, то при попытке на основе дллки поднять виртуальную машину. Т.е. он не переваривает/не находил длл.

Автор: Cockney 7.10.2017, 13:18

Не знаю, что я сделал, но вроде стало грузиться.

Автор: DarkMaster 7.10.2017, 13:19

Я практически уверен, что поправил имя дллки)

Автор: Cockney 7.10.2017, 13:23

Нет, я просто перекинул в новую папку пилот и луа. Либо я поехал, либо что...

Автор: DarkMaster 7.10.2017, 13:28

Хм... У меня путь с пробелами и кириллицей. Что может быть хуже хз. Подозреваю что-то рядом лежащее мешало. Инишник одинаковый? Его тоже копировал?

Автор: Cockney 7.10.2017, 13:33

инишник не копировал. вообще, какого хрена инишник влияет на внутреннюю работу ? то цвета не определяются, то еще что-то.

Автор: DarkMaster 7.10.2017, 15:29

Ну для начала в инишнике содержится имя дллки....

Автор: Cockney 7.10.2017, 15:44

Ну так оно у меня было всегда lua5.1.dll. В одной папке работает, в другой нет. Ладно, спишем это на мою отсталость.

Автор: DarkMaster 7.10.2017, 16:30

Цитата
Ладно, спишем это на мою отсталость.

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

Автор: Cockney 7.10.2017, 20:57

Не знаю я в чем проблема. Перенес в другую папку и все работает.

Протестите плюшку. Работает у вас ? Есть у кого ХР ? Можете там протестить ?

Файл класть к пилоту.

Дальше

Код
--lua
require("plug")
log(plug.div(12, 276))
log(plug.parse("usually i find unlike set memes man fortune", "m"))



Прикрепленные файлы
Прикрепленный файл  plug.zip ( 44,59 килобайт ) Кол-во скачиваний: 66

Автор: cirus 7.10.2017, 21:06

Цитата
Протестите плюшку. Работает у вас ?

на win10 не работает. Ошибка на require.
Прикрепленное изображение

Автор: Cockney 7.10.2017, 21:16

У меня работает и на 10. Очень интересно....

Автор: Cockney 8.10.2017, 14:53

Прикалываю другую версию луа. Если плагин не грузится с версией от кнайта, то попробуйте эту. Результат есть ?


Прикрепленные файлы
Прикрепленный файл  lua5.1.zip ( 79,99 килобайт ) Кол-во скачиваний: 88

Автор: cirus 8.10.2017, 15:17

Работает с любой dll (и твоей, и Кнайта) при условии что она имеет имя lua5.1.dll.
У меня она называлась по-другому.
Эти dll чем-то отличаются? А то по размеру разные.

Автор: Cockney 8.10.2017, 15:26

Ну, чисто по функционалу - нет. Просто разные сборки.

Автор: cirus 11.1.2018, 0:46

Цитата
DarkMaster
Не работают:
getlayout
setlayout

Код
--lua
setlayout ("0419")
log (getlayout())  // возвращает стринг
send("q")

setlayout ("0409")
log (getlayout())
send("q")
-- В блокноте напишет йq.

Цитата
getselectedtext
setselectedtext

Они и так не везде работали. getselectedtext из блокнота нормально копирует текст.
Код
--lua
wait (3000)
a=setselectedtext("text")  -- вставит не 'text', а ' text', т. е. ещё пробел добавляется вначале, тестил в блокноте

Автор: DarkMaster 11.1.2018, 13:14

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

Цитата
setlayout

приводит к полному зависанию memu.

Автор: DarkMaster 15.1.2018, 18:10

Цитата(WKnight @ 14.3.2017, 23:13) *

Починил.
Вообще workwindow это целая функция в пилоте, но на чтение ее можно и нужно использовать как обычную переменную, а вот присваивать только через set.
Так что "log (workwindow)" правильный вариант и возвращает правильное значение, а
"workwindow = handle[1][1]" работает только для тех функций, которым ничего особого от процесса не надо, и по сути есть баг.
Не послушался я Даркмастера, правильно он говорил, "делай ее функцией"...

Так собственно как окна то привязывать?

Автор: cirus 15.1.2018, 18:32

Цитата
Так собственно как окна то привязывать?

Код
--lua
h=findwindow("Lineage2")
workwindow=h[1][1]

Автор: DarkMaster 15.1.2018, 18:52

Я так и делал. Чет проблемы какие-то при этом. Где-то пашет, где-то нет.

Автор: DarkMaster 19.1.2018, 7:08

Ошибка.

--lua
send(" ")

Автор: Cockney 25.2.2018, 15:09

Кнайт, не знаю, рассматривал ли ты такой вариант, но есть такой вариант не убивать машину после окончания скрипта.

Есть апи :

Код
luaL_dostring


Сейчас ,как я понимаю, ты юзаешь luaL_dofile. Тут можно самому прочитать файл(даже можно что-то препроцессировать). Далее полученный буффер оборачиваешь в тот же цикл while (понятно как ?) и отдаешь на запуск. Скрипт крутится как надо.

Если используешь какие-то обертки, то думаю не проблема запустить луа именно из строки, а не файла.

Автор: DarkMaster 25.2.2018, 18:11

Цитата
Кнайт, не знаю, рассматривал ли ты такой вариант, но есть такой вариант не убивать машину после окончания скрипта.

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

Автор: Cockney 25.2.2018, 20:07

1)Почему все вкладки хостятся в одной машине ?
2)Так по предложенному методу все данные удалятся по выходу из while-обертки. (и при условии что под каждую вкладку выделяется одна машина).

Автор: DarkMaster 25.2.2018, 22:25

Цитата
1)Почему все вкладки хостятся в одной машине ?

Уже возможно нет, но в целом это интересный метод взаимодейсвия через глобальные переменные.
do
...
end
никто не отменял, если нужно сделать локальное пространство имен, но в целом я не уверен, как правильно было бы все это реализовать. С одной стороны необходимо иметь связь между вкладками, с другой нужно иметь бОльшую изоляцию, чем просто отсутсвие local перед переменной имхо.
2) даже то, что внутри while, если не прописан local, будет глобальным.

Автор: Cockney 25.2.2018, 23:35

Я не понял, что ты написал, поэтому напишу свое видение smile.gif

Если брать работу луа без оберток, то одна машина представлена одним объектом lua_State. Представим, что их 3 : a1, a2, a3.

Создаем

Код
a1 = luaL_newstate();
a2 = luaL_newstate();
a3 = luaL_newstate();


Добавим по одной глобальной переменной.

Код
lua_pushinteger(a1, 100);
lua_setglobal(a1, "a1");
lua_pushinteger(a2, 200);
lua_setglobal(a2, "a2");
lua_pushinteger(a3, 300);
lua_setglobal(a3, "a3");


Все переменные действительны только в своих машинах, т.е. переменной a1 нет в машине a2 и a3 и т.п.
Можем делать что угодно, не боясь зацепить другую вкладку по сути.

А если нам нужен доступ к переменной другой вкладки, то получаем его так :

Код
lua_getglobal(a1, "a1"); //вытолкали на верх стека значение a1 в машине а1
lua_pushinteger(a2, lua_tointeger(a1, lua_gettop(a1))); //скопировали из машины a1 на верх стека a2
lua_setglobal(a2, "a2"); //присвоили в машине a2 переменной a2


Все изолированно. Доступ к другим вкладкам имеется. Разумеется, допилить можно еще получше, но это, как я считаю, работает уже сносно (ну или хотя бы в теории).

Автор: Cockney 25.2.2018, 23:47

Ну, а это реализация абстрактной script_variable(<script number>, "varname")

Код
//global (in pilot)
int vmsCnt = 20;
lua_State *vms = new lua_State[cmsCnt];

int script_variable(lua_State *L)
{
   int vm = lua_tointeger(L, /*param number*/);
   lua_getglobal(vms[vm], lua_tostring(L, /*param number*/));
   lua_xmove(vms[vm], L, 1);
   return 1;
};

Автор: Cockney 26.2.2018, 0:08

while не имеет понятия локальности. Как и в любом языке работа идет после объявления переменной. Если требуется в функции обрабатывать локальную переменную с таким же именем, то переопределяем ее с пометкой local. local в глобальной видимости = global. По сему, локальность может быть только в функциях(local не обязательно указывать, если нет глобальных с таким же именем), неймспейсах или че там еще есть. НУ ИЛИ Я ОЧЕНЬ СИЛЬНО ОШИБАЮСЬ, и луа девелоперы решили перевернуть систему и по моему мнению не очень умные люди.

Код
global r = 100

function mem()
   local r = 2 --переопределили
   while 1 do
      log(r)
   end
end

function mem2()
   while 1 do
      log(r)
   end
end

function loc()
--здесь все локальное, даже без пометок
end

mem()
mem2()



Не работает у меня, эксепшен бьет, поправьте.

Автор: Cockney 26.2.2018, 0:23

Да, действительно, я не прав, local нужно писать в каждой функции, иначе будет создавать глобальная переменная. Что тут сказать...

Но в любом случае речь не идет о счетчиках для циклов и т.п. Нам нужны вещи типа clickoffset, так что этот вопрос мало что дает.

Автор: DarkMaster 26.2.2018, 17:31

Цитата
А если нам нужен доступ к переменной другой вкладки, то получаем его так :

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

Автор: Cockney 26.2.2018, 19:35

Не вижу проблем использовать синхронизацию. Крит. секции например. Обернуть в них геттер/сеттер а дальше все система разрулит.

Автор: DarkMaster 26.2.2018, 20:48

Цитата
Не вижу проблем использовать синхронизацию. Крит. секции например. Обернуть в них геттер/сеттер а дальше все система разрулит.

Сколько лет фиксили, фиксили и фиксили пилот по этому поводу? Кстати насколько я знаю проблема осталась, но скорее, как теоретическая, т.к. на практике она только в многочасовых искуственных тестах иногда проявляется. Я так понимаю это проблема не системы, а старой версии делфи на которой написан пилот и которую вроде как даже обновить не получается.

Автор: Cockney 26.2.2018, 22:53

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

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)