Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Вопросы по использованию FFI
Latest post of the previous page:
Что-то не так делали, значит.fml2 wrote:Я пробовал и с %p, но выводилось просто "%p", т.е. спецификатор ничего не преобразовывал, а выводился просто как строка.
Фар использует LuaJIT, иfml2 wrote:Что там используется (просто Lua или LuaJit), в чем между ними разница и как сказать, чем именно хочешь пользоваться, я не знаю.
%p
в string.format
должно работать.- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
>А как сделать без %p?
Что касается %p, то нужно помнить что при вызове
tostring(handle):gsub("cdata<unsigned int>: ","")
tostring(handle):match": (0x%w+)"
Что касается %p, то нужно помнить что при вызове
format
как метода (через двоеточие) используется вовсе не string.format
Вопросы по использованию FFI
tostring(handle)
у меня выдает нечто типа "cdata<void *>: 0x0000029c" -- не то, что надоtonumber(handle)
выдает nil -- не то, что надоtonumber(ffi.cast("UINT_PTR", handle))
выдает то, что надо. Но почему так сложно?При задании спецификатора "%p" и handle в качестве значения вылезает ошибка dbgprint.lua:49: invalid option '%p' to 'format' (я пользуюсь модулем dbgprint для вывода отладочной информации, в указанной строке стоит "
fmt:format(...
")- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
0x0000029c
- вроде бы как раз то что надо, не?
Что и требовалось доказать.
Вопросы по использованию FFI
Не совсем. Надо отрезать кусок в начале
Я ничего не пытался доказать, а просто спрашивал, как вывести значение типа HANDLE, и удивлялся, что это делается не совсем просто
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Вопросы по использованию FFI
результат:
tostring и cast выдают одинаковый результат, не знаю в чём там у вас проблема. %p выводит что-то странное, да.
Code: Select all
╔═══════════════════════════════╗
║ 1│ cdata<void *>: 0x00000007 ║ <- ok
║ 2│ cdata<void *>: 0x00000007 ║ <- ok
║ 3│ nil ║
║ 4│ 7 ║ <- ok
║ 5│ 0x01e04fa8 ║ <- ???
╚═════════ 5 arguments ═════════╝
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
О да:
tostring(handle):match": (0x%w+)"
Что может быть проще tostring??
Вопросы по использованию FFI
Т.е. string.format "%p" понимает, а string:format -- нет? Семен Семеныч!zg wrote:string.format("%p",handle))
Почему это значение вам кажется странным? Указатель как указатель, нет?zg wrote:%p выводит что-то странное, да.
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Вопросы по использованию FFI
потому что это не хэндл.fml2 wrote:Почему это значение вам кажется странным? Указатель как указатель, нет?
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Вопросы по использованию FFI
почему вы решили, что он не работает?fml2 wrote:Куда по этому поводу писать (что %p не работает)?
Ликбез по Lua
Пытаюсь перевести программу на Си в Lua ffi.
Выполняю код:. Ошибок нет. Но если я попробую его исполнить еще раз возникает синтаксическая ошибка. В чем проблема и как сделать, чтобы при попытке "выполнить" include файл второй раз синтаксических ошибок не выдавалось.
Выполняю код:
Code: Select all
local ffi = require("ffi")
local C = ffi.C
ffi.cdef[[
static const unsigned WM_USER=0x0400;
static const unsigned WM_SETCONSOLEINFO=WM_USER+201;
]]
Code: Select all
╔═════════════════════ LuaMacro ══════════════════════╗
║ ';' expected near '=' at line 2 ║
║ stack traceback: ║
║ [C]: in function 'cdef' ║
║ :7: in main chunk ║
╟─────────────────────────────────────────────────────╢
║ { OK } ║
╚═════════════════════════════════════════════════════╝
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Ликбез по Lua
определяется константа с уже существующим именем.gotar wrote:В чем проблема
gotar wrote:и как сделать, чтобы при попытке "выполнить" include файл второй раз синтаксических ошибок не выдавалось.
Code: Select all
local function safe_cdef(def) pcall(ffi.cdef,def) end
safe_cdef"static const unsigned WM_USER=0x0400;"
safe_cdef"static const unsigned WM_SETCONSOLEINFO=WM_USER+201;"
Ликбез по Lua
gotar
В cdef объявления - структуры и ф-ии, исполняемого кода там быть не должно.
Ваши присваивания можно просто перенести в lua код.
Про вторую попытку - имеется ввиду это: http://forum.farmanager.com/viewtopic.p ... 51#p119951 ?
В cdef объявления - структуры и ф-ии, исполняемого кода там быть не должно.
Ваши присваивания можно просто перенести в lua код.
Про вторую попытку - имеется ввиду это: http://forum.farmanager.com/viewtopic.p ... 51#p119951 ?