|
|
|
Помогите освоить LUA |
|
|
KaZaK |
1.3.2019, 14:58
|
Neophyte
Сообщений: 28
Регистрация: 10.2.2019 Группа: Пользователи Наличность: 0
Пользователь №: 19.228
|
Скрипт подгружает модуль какой то, где его взять?! или я не правильно понимаю..) Цитата(sutra @ 28.2.2019, 16:32) [code] --lua local ffi=require "ffi" local rmem=ffi.cast local function FindColor(addr,len,fx1,fy1,fx2,fy2,usl,numf,stepX,stepY)
Цитата(sutra @ 28.2.2019, 16:53) FindImage тоже могу дать если надо. Но только без описания работы, ну просто лень. В 2-х словах сложно пояснить, слишком много наворочано, но ищет супер, просто нет слов. Спасибо Дарку, научил как надо делать!
Давай))
|
|
|
|
sutra |
1.3.2019, 15:29
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Цитата Скрипт подгружает модуль какой то, где его взять?! или я не правильно понимаю..) Ничего грузить не надо, всё включено, пробуй. Цитата Давай)) Хорошо, погоди чутка, у меня такая свалка этих финдов, не один десяток, сейчас попробую подобрать приемлемый и не совсем глюкавый вариант, просто переделывал по 10 раз, толком не тестировал. А то будет нехорошо, если сразу полезут ошибки. Color тоже не тестировал, если что не так пойдёт - говори. Тупо пробовал, вроде ищет. Короче не гонял я пока его на всех режимах, но вроде должен работать. Только аккуратнее с параметрами, никакой проверки НЕТ на корректность задания.
|
|
|
|
sutra |
1.3.2019, 16:02
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Пока вот так, совсем кратко, попозже попробую растолковать поподробнее что к чему. Запросто могут быть ошибки, практически не тестил этот вариант, но он вроде попроще для понимания. Код и примеры использования функции FindImage
Код --lua local ffi=require "ffi" local rmem=ffi.cast local function ImageToArray(ad,l,x1,y1,x2,y2) local h,w=y2-y1+1,x2-x1+1 local k=h*w local d,a=ad+3*x1+l*y1,ffi.new("uint8_t["..k.."][3]") if w==len then for i=0,k-1 do a[i][0],a[i][1],a[i][2],d=rmem("unsigned char*",d)[0],rmem("unsigned char*",d)[1],rmem("unsigned char*",d)[2],d+3 end else local i,s=0,l-w*3 for y=1,h do for x=0,w-1 do a[i][0],a[i][1],a[i][2],d,i=rmem("unsigned char*",d)[0],rmem("unsigned char*",d)[1],rmem("unsigned char*",d)[2],d+3,i+1 end d=d+s end end deleteimage(ad) return a end local function CreateFindArray(co,LG) if type(co[1][1])=="string" then co[1][1],co[1][2],co[1][3],co[1][4]=loadimage(co[1][1]) end local k,q,b,g,r,p,d,ad,w,h,l=0,1,ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t[6]"),ffi.new("int16_t[6]"),co[1][1],co[1][2],co[1][3],co[1][4] local ar,f,x,y,i,R,G,B,P,D,RG,RB,GB,ba,ga,ra=ffi.new("uint32_t[?][7]",w*h+1),ffi.new("uint16_t["..h.."]["..w.."]") while q<#co do & nbsp;q,R,G,B,P,D,RG,RB,GB,y,x,i=q+1,true,true,true,true,true,true,true,true,0,0, ad if co[q].R then P,R,p[0],p[1]=false,false,co[q].R,co[q].R2 or co[q].R end if co[q].G then P,G,p[2],p[3]=false,false,co[q].G,co[q].G2 or co[q].G end if co[q].B then P,B,p[4],p[5]=false,false,co[q].B,co[q].B2 or co[q].B end if co[q].RG then D,RG,d[0],d[1]=false,false,co[q].RG,co[q].RG2 or 255 end if co[q].RB then D,RB,d[2],d[3]=false,false,co[q].RB,co[q].RB2 or 255 end if co[q].GB then D,GB,d[4],d[5]=false,false,co[q].GB,co[q].GB2 or 255 end if co[q].acc then acc=(100-co[q].acc)/100 else acc=0 end if co[q].dev then v=co[q].dev else v=0 end if co[q].fgr then while y<h do while x<w do if f[y][x]==0 then b,g,r=rmem("unsigned char*",i)[0],rmem("unsigned char*",i)[1],rmem("unsigned char*",i)[2] if(D or((RG or r-g>=d[0]and r-g<=d[1])and(RB or r-b>=d[2]and r-b<=d[3])and(GB or g-b>=d[4]and g-b<=d[5])))and(P or((R or r>=p[0]and r<=p[1])and(G or g>=p[2]and g<=p[3])and(B or b>=p[4]and b<=p[5])))then k,ba,ga,ra,f[y][x]=k+1,b*acc,g*acc,r*acc,1 ar[k]={math.max(0,math.floor(b-ba-v)),math.max(0,math.floor(g-ga-v)),math.max(0,math.floor(r-ra-v)),math.min(255,math.ceil(b+ba+v)),math.min(255,math.ceil(g+ga+v)),math.min(255,math.ceil(r+ra+v)),x+y*LG}
end end i,x=i+3,x+1 end y=y+1 i,x=ad+y*l,0 end else while y<h do while x<w do if f[y][x]==0 then b,g,r=rmem("unsigned char*",i)[0],rmem("unsigned char*",i)[1],rmem("unsigned char*",i)[2] if not((D or((RG or r-g>=d[0]and r-g<=d[1])and(RB or r-b>=d[2]and r-b<=d[3])and(GB or g-b>=d[4]and g-b<=d[5])))and(P or((R or r>=p[0]and r<=p[1])and(G or g>=p[2]and g<=p[3])and(B or b>=p[4]and b<=p[5]))))then k,ba,ga,ra,f[y][x]=k+1,b*acc,g*acc,r*acc,1 ar[k]={math.max(0,math.floor(b-ba-v)),math.max(0,math.floor(g-ga-v)),math.max(0,math.floor(r-ra-v)),math.min(255,math.ceil(b+ba+v)),math.min(255,math.ceil(g+ga+v)),math.min(255,math.ceil(r+ra+v)),x+y*LG} end end i,x=i+3,x+1 end y=y+1 i,x=ad+y*l,0 end end end deleteimage(co[1][1]) ar[0]={k,LG,w,h,l} return ar end -------------------------------------------------------------------------------- local function FindImage(a,lG,x1,y1,x2,y2,pic,numf,sim,v1,v2,v3) local af,k,wi={},1 if type(a)~="cdata" then if not(a)then x1,y1,x2,y2,a,wi,wi,lG=0,0,x2-x1,y2-y1,getimage(x1,y1,x2,y2,lG) end a=ImageToArray(a,lG,x1,y1,x2,y2) end wi,numf,sim,v1,v2,v3=x2-x1+1,numf or 1,sim or 100,v1 or 2,v2 or 1,v3 or 0 if type(pic)~="cdata" then pic=CreateFindArray(pic,wi) elseif pic[0][1]~=x2-x1+1 then for i=1,pic[0][0]do local ys=math.floor(pic[i][6]/pic[0][1]) pic[i][6]=pic[i][6]-ys*pic[0][1]+ys*wi end pic[0][1]=x2-x1+1 end local sr,x,y,ins,xe,ye,V1,V2,V3,n=true,0,0,0,wi+1-pic[0][2],(y2+2-pic[0][3]-y1)*wi,v1+3,v2+3,v3+3 if sim<100 then sim=pic[0][0]*0.01*(100-sim) local j=0 while y<ye do while x<xe do for i=1,pic[0][0]do n=ins+pic[i][6] if a[n][v1]<pic[i][v1]or a[n][v1]>pic[i][V1]or a[n][v2]<pic[i][v2]or a[n][v2]>pic[i][V2]or a[n][v3]<pic[i][v3]or a[n][v3]>pic[i][V3]then j=j+1 if j>sim then sr=false break end end end if sr then af[k],k={x,y/wi},k+1 if k>numf then return af end end x,sr,ins,j=x+1,true,ins+1,0 end x,y,ins=0,y+wi,ins+pic[0][2]-1 end else while y<ye do while x<xe do for i=1,pic[0][0]do n=ins+pic[i][6] if a[n][v1]<pic[i][v1]or a[n][v1]>pic[i][V1]or a[n][v2]<pic[i][v2]or a[n][v2]>pic[i][V2]or a[n][v3]<pic[i][v3]or a[n][v3]>pic[i][V3]then sr=false break end end if sr then af[k],k={x,y/wi},k+1 if k>numf then return af end end x,sr,ins=x+1,true,ins+1 end x,y,ins=0,y+wi,ins+pic[0][2]-1 end end return af end -------------------------------------------------------------------------------- log "clear" log "mode compact" -- !!!!! РАСПАКОВАТЬ КАРТИНКИ, чтобы примеры работали !!!!! local aff --Вариант 1, обычный поиск картинки как таковой local pg,wg,hg,lg=loadimage([[scr.bmp]]) local pl,wl,hl,ll=loadimage([[target_.bmp]]) tmc=os.clock() -- будут сравниваться ВСЕ пиксели R(0-255) тут играть параметрами особо нет смысла -- те, которые тут выставлены подойдут для 99% случаев, ищем 7 картинок, схожесть -- при таком поиске лучше и не трогать, а то он найдёт не один десяток "фонов". aff=FindImage(pg,lg,0,0,wg-1,hg-1,{{pl,wl,hl,ll},{R=0,R2=255,fgr=true,acc=90,dev=5}},7,100) tmc=os.clock()-tmc log("Время поиска: ",string.format("%.3f",tmc)," сек.") log("Найдено - ",#aff," изображений") for i=1, #aff do log(table.concat(aff[i], " ")) end
--Вариант 2, скажем это наиболее продвинутый local pg,wg,hg,lg=loadimage([[scr.bmp]]) local pl,wl,hl,ll=loadimage([[target_.bmp]]) -- СОЗДАЁМ массив искомых пикселей -- задаём искать в картинке только пиксели с разностью значений между каналами RED-GREEN - 100 -- будет искаться красная рамка -- с точностью поиска потом на снмке экрана (в примере загруженный образ [[scr.bmp]]) 90% -- и максимальным отклонением значений каналов 5 local pix=CreateFindArray({{pl,wl,hl,ll},{RG=100,fgr=true,acc=90,dev=5}},wg) -- ищем максимум 7 картинок, со схожестью с оригиналом 70% tmc=os.clock() aff=FindImage(pg,lg,0,0,wg-1,hg-1,pix,7,71) tmc=os.clock()-tmc log("Время поиска: ",string.format("%.3f",tmc)," сек.") log("Найдено - ",#aff," изображений") for i=1, #aff do log(table.concat(aff[i], " ")) end
--Вариант 3, не думая, подойдёт для обычного использования local pg,wg,hg,lg=loadimage([[scr.bmp]]) local pl,wl,hl,ll=loadimage([[target_.bmp]]) tmc=os.clock() aff=FindImage(pg,lg,0,0,wg-1,hg-1,{{pl,wl,hl,ll},{RG=100,fgr=true,acc=90,dev=5}},7,71) tmc=os.clock()-tmc log("Время поиска: ",string.format("%.3f",tmc)," сек.") log("Найдено - ",#aff," изображений") for i=1, #aff do log(table.concat(aff[i], " ")) end
--Вариант 4, задаём в качестве фона пиксели разность каналов RED-BLUE у которых не более 50 -- убираем ключ в таблице fgr=true , что означает что это не фореграунд, а иначе фон -- (плохой подход в данном случае, будет лишний пиксель, но при 70% схожести найдётся) local pg,wg,hg,lg=loadimage([[scr.bmp]]) local pl,wl,hl,ll=loadimage([[target_.bmp]]) tmc=os.clock() aff=FindImage(pg,lg,0,0,wg-1,hg-1,{{pl,wl,hl,ll},{RB=-255,RB2=50,acc=90,dev=5}},7,70) tmc=os.clock()-tmc log("Время поиска: ",string.format("%.3f",tmc)," сек.") log("Найдено - ",#aff," изображений") for i=1, #aff do log(table.concat(aff[i], " ")) end
--Вариант 5, задаём в качестве фона пиксели обозначая диапазоны каналов (плохой подход в данном случае ... см. выше) local pg,wg,hg,lg=loadimage([[scr.bmp]]) local pl,wl,hl,ll=loadimage([[target_.bmp]]) tmc=os.clock() local pix=CreateFindArray({{pl,wl,hl,ll},{R=0,G=0,B=0,R2=100,G2=100,B2=100,acc=90,dev=5}},wg) aff=FindImage(pg,lg,0,0,wg-1,hg-1,pix,7,70) tmc=os.clock()-tmc log("Время поиска: ",string.format("%.3f",tmc)," сек.") log("Найдено - ",#aff," изображений") for i=1, #aff do log(table.concat(aff[i], " ")) end
q,R,G,B,P,D,RG,RB,GB,y,x,i=q+1,true,true,true,true,true,true,true,true,0,0,ad Почему то неверно копируется вот эта строка, переправь сам на вот этот вариант. Это в начале функции local function CreateFindArray(co,LG) Картинки кидай прямо в Пилотовскую папку, ну или переделывай пути в примерах. Поиграй параметрами, это даст понимание что и как ищется. Отличия от Кнайтовского варианта, здесь работает параметр относительной погрешности, как я всегда его называл, здесь это ключ в таблице acc, что вообще-то означает точность. Им можно играть в гигантском интервале, только скорость будет конечно падать. Это вообще основной параметр. dev - deviation - отклонение задавать надо в интервале 3-10 единиц. Ну можешь поэкспериментировать. Главный плюс этой функции - скорость. И как уже говорил - точность поиска. Ничего лишнего не ищется, если не считать параметра схожести. Да, вот ещё, память чистится после выполнения функции. Если чистить не надо, надо иначе задавать параметры, но это потом уже подробнее поясню. Сделано конечно моими куриными мозгами, но идея - великолепная, при правильном использовании, я находил все мишени и прицел в десять раз быстрее, чем в данных мною "простых" примерах. Короче оставлена возможность обрабатывать картинку "руками" и подсовывать такой вариант в функцию.
Прикрепленные файлы
pictures.zip ( 2,23 мегабайт )
Кол-во скачиваний: 27
|
|
|
|
sutra |
5.3.2019, 1:06
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Цитата Что будет быстрее сканировать область findimage(перебирать картинки) на языке lua или на языке пилота? Ну конечно на текущий момент на lua. Полно тестов. Кнайт дорабатывает данную функцию, поэтому её и нет пока в справке для lua. Отвечая на вопрос по пунктам. На lua быстрее, НО, дело не только собственно в lua. ДаркМастер, не так давно показал как на lua получать мгновенный доступ к памяти, где лежат образы картинок, да и снимка экрана тоже. Это дало возможность ускорить поиск картинок. Основы, принципы, дискуссия - эта тема практически только про это. Готовый пример самопальной, НО АБСОЛЮТНО рабочей функции findimage я дал, с малюсенькой недоработкой по правильной очистке памяти, точнее мне просто лень редактировать код который я пару дней назад дал. Но пример функции абсолютно рабочий и на мой взгляд очень даже не плохой. Попробуйте и сравните сами, что Вы можете найти стандартом и самопалом и с какой скоростью. Мне казалось, что эта тема никому не интересна, если есть интерес (а я его определяю просто - пробовали мой пример функции или нет), то сделаю подробное описание работы, да в принципе там МНОГО чего можно улучшить и упростить, вплоть до абсолютно бездумного использования, используя анализ картинки без участия юзера. Мне очень трудно объяснять некоторые аспекты работы функции, я специально пока дал просто примеры использования. Вот Вы в пожеланиях указали, что неплохо бы использовать экранную лупу. Да, наверное. Только я всегда и ВСЁ анализирую в граф. редакторе, где есть любое увеличение, где всегда отражаются актуальные координаты и для каждого пикселя всегда показываются актуальные значения каналов RGB. Самый простой и весьма эффективный редактор, в котором всё это есть - Paint Shop Pro. Когда своими глазками всё это видишь - понимание всего остального намного проще и точнее. Могу сказать только одно, хотя уже не раз говорил. Найти можно абсолютно ВСЁ и очень быстро и для большинства случаев моей функции будет достаточно. Если есть что-то очень хитрое с "тяжёлыми" условиями поиска - спрашивайте - давайте примеры, уверяю - найду и найду мгновенно, даже чат.
|
|
|
|
cirus |
5.3.2019, 1:58
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26745
Пользователь №: 16.971
Возраст: 29
|
Цитата Что будет быстрее сканировать область findimage(перебирать картинки) на языке lua или на языке пилота? Без разницы. Функция одна и также. Если хотите быстрее, то: Загружаете картинки в память loadimage, 1 раз вначале скрипта. 1. Делается скрин getimage. 2. Ищутся картинки на скрине. 3. Удаляется скрин. Цитата поэтому её и нет пока в справке для lua Вообще-то есть findimage. Нет findcolor'а потому что Кнайт не исправил синтаксис.
|
|
|
|
sutra |
5.3.2019, 3:03
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Цитата Без разницы. Функция одна и также. И опять не соглашусь, причём категорически не соглашусь. Давайте-ка хоть один пример покажите, где Вы хоть чутка приблизитесь к скорости моей функции, в десятки, сотни раз медленнее. Цитата Вообще-то есть findimage. И опять не соглашусь. ГДЕ? В справке по lua есть findimage. Сорри, обновил справку, добавили findimage. Хотя опять же, ни слова, ни пол-слова про то, что добавили. Называется - а ты пробуй друг мой, может найдёшь. И опять же, вопрос был даже не про стандарт финда в lua, а про разницу в скорости между Пилотом и lua. ГДЕ там одинаковая скорость? Может конечно что подправили, только я нигде не видел, что там что-то исправлялось. А из того, что я тестировал и показывал результаты тестов ... там и РЯДОМ ничего близко нет, а иначе я бы и не занимался этим финдом. Я же показывал, как КАТАСТРОФИЧЕСКИ падает скорость при совместном использовании параметров deviation и accuracy. В общем, неприятный осадок у меня остался, каким-то изгоем себя чувствую. Ради бога. Я никогда, ни на что не претендовал и ни на что не претендую, и не собираюсь. На нет и спроса нет - ищите сами. Только прицелы и монетки я нашёл, хотя мне говорили - давай-ка найди. И не только прицелы, а ВСЁ, что там есть на скрине и мгновенно (в частном редактировании картинок). Чат твой Сайрус, да без проблем, легко и просто, дерзайте тогда сами - удачи всем!
|
|
|
|
sutra |
5.3.2019, 5:24
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Цитата Это одно и тоже и разницы в скорости не будет вообще. Кто бы сомневался, ВООБЩЕ не будет разницы между ЛЮБОЙ функцией Пилота и lua. Выполняться будет собственно одно и то же. А попробуйте ЭТО сделать 1000 раз, а попробуйте это сделать в цикле. Я же с самого начала спросил на форуме про преимущества lua и каков был мне ответ??? Какие были тесты??? Вы же сами мне показывали что к чему. В Ваших примерах тоже не было бы разницы при единичных вызовах операторов и функций, но Вы показывали примеры в циклах. Зачем же вводить в заблуждение людей? Пока что Пилот - это интерпретатор, lua - пусть и кривой, но компилятор. Что тут обсуждать, по скорости даже супер-интерпретатор не сможет соперничать с самым убогим компилятором? Конкретно, в частностях, Вы конечно же всегда правы, только я интуитивно чую вопрос, наверное потому, что сам прошёл через всё это. Я даю практические рекомендации, насколько я понимаю вопрос, как обычный рядовой юзер, пытаясь не вдаваться в теории и нюансы. Когда спрашиваю сам, то точно про то же, про практическое применение. Конечно можно и про остальное поговорить, только при соответствующих вопросах, в соответствующих темах. Тут и тема то про финды, возможно людей что-то заинтересовало, а ВЫ им, да на фиг это всё, всё одинаково!! Чего тут говорить, вот такое у меня сложилось впечатление, по Вашим высказываниям. Может я и не прав конечно, ну тогда извините ... "хуже не будет, время рассудит". Только у меня как-то пропало желание что-либо говорить на эту тему и выглядеть каким-то недоразвитым. Дополнить, пояснить, опровергнуть, покритиковать - это я понимаю, а вот противопоставление, которое ну явно на лицо (в такой хорошо завуалированной форме) меня явно раздражает. Как-будто вот Вы специально ждали моих комментов, а я ответил на вопрос далеко не тут же, я тут такой же гость, как и большинство участников форума. Я не настолько глуп в понимании людей и в понимании происходящего (в отличии от моих познаний в программировании).
|
|
|
|
sutra |
5.3.2019, 5:49
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Собственно я и делал то всё не для себя, для себя уже всё сделано (попроще). Пытался как-то универсальность функции сделать. Ждал комментов, рецензий, чтобы повысить свой уровень, чтобы указали на явные огрехи стиля, синтаксиса, скорости выполнения (а их там хватает). Код, как говорится открытый, каждый может править, как ему лучше. Поделился сначала идеей, потом мало-мальски дал рабочий вариант кода, учитывая, что может хоть что-то пригодится при совершенствовании и развитии Пилота. А тут ответ ... да НЕТ РАЗНИЦЫ ... вот потом и объясняй, что разница есть ... вот как-то так ... сорри. Цитата findimage(перебирать картинки) И Вы частенько не вникаете в суть вопроса. Вот дал цитату вопроса. Так кто тут не прав??? Вопрос конкретнее некуда - ПЕРЕБИРАТЬ. Цитата На lua быстрее, НО, дело не только собственно в lua А это начало моего ответа. Так кто тут не прав? Так что 1-0 в мою пользу, без вариантов. Но желание общаться - пропало.
|
|
|
|
DarkMaster |
8.3.2019, 1:15
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27725
Пользователь №: 11.279
|
Цитата возвращать из плюсов без луа таблиц / с помощью jit ? Просто описывается функция, набор типов данных. https://luajit.org/ext_ffi_tutorial.htmlКод local ffi = require("ffi") ffi.cdef[[ unsigned long compressBound(unsigned long sourceLen); int compress2(uint8_t *dest, unsigned long *destLen, const uint8_t *source, unsigned long sourceLen, int level); int uncompress(uint8_t *dest, unsigned long *destLen, const uint8_t *source, unsigned long sourceLen); ]] пример биндингов. Внутри длл никаких модификаций не требуется - обычная дллка.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Cockney |
8.3.2019, 9:47
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21064
Пользователь №: 16.156
|
Если конкретнее, то переведи Код if usl.R then P,R,p[0],p[1]=false,false,usl.R,usl.R2 or usl.R end if usl.G then P,G,p[2],p[3]=false,false,usl.G,usl.G2 or usl.G end if usl.B then P,B,p[4],p[5]=false,false,usl.B,usl.B2 or usl.B end if usl.RG then D,RG,d[0],d[1]=false,false,usl.RG,usl.RG2 or 255 end if usl.RB then D,RB,d[2],d[3]=false,false,usl.RB,usl.RB2 or 255 end if usl.GB then D,GB,d[4],d[5]=false,false,usl.GB,usl.GB2 or 255 end в си, заранее не зная где стоят usl.*. И вот это Код где первые два - числа, а arr массив на структур.
|
|
|
|
Cockney |
8.3.2019, 13:31
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21064
Пользователь №: 16.156
|
Вероятно, мы друг друга не понимаем. Опишу еще раз, что хочу видеть. 1)В скрипте прикастовали типы ко всем параметрам функции. Так ? 2)На вход длл, которая не знает ничего о луа, подаются уже сишные типы ? Так ? 3)Местный usl превратится в некий массив uint8_t. Так ? 4)Из скрипта я вызываю длл, в которую идет вышеописанный массив. Так ? Если все так, то как быть в ситуациях, когда таблица может быть задана как Код так и Код { G = 12, B = 100, R = 10} Что примерно эквивалентно касту uint8_t*: Код и Код соответственно. Теперь переносимся внутрь функции длл. Нам пришел массив с числами. Но что это за условия ? R,G или RG ? и под какими индексами они идут ?
|
|
|
|
DarkMaster |
9.3.2019, 0:33
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27725
Пользователь №: 11.279
|
Цитата 1)В скрипте прикастовали типы ко всем параметрам функции. Так ? cast при этом в явном виде не используется вообще. Используется исключительно ffi.cdef, где по сути объявляется прототип функции с указанием типов в стиле и синтаксисе си. Цитата 2)На вход длл, которая не знает ничего о луа, подаются уже сишные типы ? Так ? Явно - нет. Пользователь отправляет обычные Lua данные. cast (если это вообще cast) вызывается где-то в глубине потрахов ffi и пользователь при этом ни о чем не догадывается. Т.е.: local var = 1 my_func(1) При этом my_func() может быть функцией из dll подключенной через ffi. Никаких cast'ов пользователю вручную вызывать не нужно. Цитата 3)Местный usl превратится в некий массив uint8_t. Так ? здесь объявляются си массивы r,g,b,p,d через new. local lx,ly,r,g,b,p,d=fx2-fx1+1,fy2-fy1+1,ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t[6]"),ffi.new("int16_t[6]") далее идет проверка наличия в lua'шной таблицы полей usl.* и привсваиваются значения в сишную таблицу из луашной: P,R,p[0],p[1]=false,false,usl.R,usl.R2 or usl.R т.е. у нас есть некторый массив си p в который помещаются данные из луа таблицы usl. Цитата 4)Из скрипта я вызываю длл, в которую идет вышеописанный массив. Так ? Из скрипта любая dll функция вызывается как обыкновенная lua функция. Единственная разница в том, что должена быть заранее объявлено через ffi.cdef. Т.е. фактически: ffi.cdef[[ unsigned long compressBound(unsigned long sourceLen);]] является объявлением правил приведения типов при вызове функции из луа и объвлением. Цитата Если все так, то как быть в ситуациях, когда таблица может быть задана как ffi сам приведет типы, но нужно понимать, что для корректной передачи может понадобиться передавать данные либо отдельными переменными для приведения в автоматическом режиме. Если же есть необходимость передать таблицу, то нужно не забывать, что таблица и массив вещи разные и порядок элементов в луа таблице не регламентирован. Этот момент не попадался под руку, но нужно понимать, что если функция ожидает массив, то нужно отправлять массив, а если таблицу, то таблицу. Сообщение отредактировал DarkMaster - 9.3.2019, 2:03
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|