Вопросы по использованию FFI

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Shmuel
Posts: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Вопросы по использованию FFI

Post by Shmuel » Mon 27 Oct, 2014 07:27

Latest post of the previous page:

fml2 wrote:Я пробовал и с %p, но выводилось просто "%p", т.е. спецификатор ничего не преобразовывал, а выводился просто как строка.
Что-то не так делали, значит.
fml2 wrote:Что там используется (просто Lua или LuaJit), в чем между ними разница и как сказать, чем именно хочешь пользоваться, я не знаю.
Фар использует LuaJIT, и %p в string.format должно работать.

User avatar
John Doe
Бюрократ
Posts: 11217
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 80 times

Вопросы по использованию FFI

Post by John Doe » Mon 27 Oct, 2014 09:03

>А как сделать без %p?
tostring(handle):gsub("cdata<unsigned int>: ","")
tostring(handle):match": (0x%w+)"
Что касается %p, то нужно помнить что при вызове format как метода (через двоеточие) используется вовсе не string.format

User avatar
zg
zero-gravity
Posts: 5262
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 43 times
Contact:

Вопросы по использованию FFI

Post by zg » Mon 27 Oct, 2014 10:43

tostring разве не работает?

User avatar
John Doe
Бюрократ
Posts: 11217
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 80 times

Вопросы по использованию FFI

Post by John Doe » Mon 27 Oct, 2014 10:51

Работает

P.S.
Так тоже работает: tonumber(ffi.cast("UINT_PTR",handle))

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

Вопросы по использованию FFI

Post by fml2 » Mon 27 Oct, 2014 14:09

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(...")

User avatar
John Doe
Бюрократ
Posts: 11217
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 80 times

Вопросы по использованию FFI

Post by John Doe » Mon 27 Oct, 2014 14:25

fml2 wrote: нечто типа "cdata<void *>: 0x0000029c" -- не то, что надо
0x0000029c - вроде бы как раз то что надо, не?
fml2 wrote: fmt:format
Что и требовалось доказать.

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

Вопросы по использованию FFI

Post by fml2 » Mon 27 Oct, 2014 14:36

John Doe wrote: вроде бы как раз то что надо, не?
Не совсем. Надо отрезать кусок в начале
John Doe wrote: Что и требовалось доказать.
Я ничего не пытался доказать, а просто спрашивал, как вывести значение типа HANDLE, и удивлялся, что это делается не совсем просто

User avatar
zg
zero-gravity
Posts: 5262
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 43 times
Contact:

Вопросы по использованию FFI

Post by zg » Mon 27 Oct, 2014 14:38

  1. local ffi=require("ffi")
  2. local C=ffi.C
  3. ffi.cdef[[
  4. void* GetStdHandle(uint32_t nStdHandle);
  5. ]]
  6. local handle=C.GetStdHandle(-11)
  7. far.Show(handle,tostring(handle),tonumber(handle),tonumber(ffi.cast("UINT_PTR", handle)),string.format("%p",handle))
результат:

Code: Select all

╔═══════════════════════════════╗
║  1│ cdata<void *>: 0x00000007 ║ <- ok
║  2│ cdata<void *>: 0x00000007 ║ <- ok
║  3│ nil                       ║
║  4│ 7                         ║ <- ok
║  5│ 0x01e04fa8                ║ <- ???
╚═════════ 5 arguments ═════════╝
tostring и cast выдают одинаковый результат, не знаю в чём там у вас проблема. %p выводит что-то странное, да.

User avatar
John Doe
Бюрократ
Posts: 11217
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 80 times

Вопросы по использованию FFI

Post by John Doe » Mon 27 Oct, 2014 14:41

fml2 wrote: Не совсем. Надо отрезать кусок в начале
О да: tostring(handle):match": (0x%w+)"
fml2 wrote: не совсем просто
Что может быть проще tostring??

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

Вопросы по использованию FFI

Post by fml2 » Mon 27 Oct, 2014 14:56

zg wrote:string.format("%p",handle))
Т.е. string.format "%p" понимает, а string:format -- нет? Семен Семеныч!
zg wrote:%p выводит что-то странное, да.
Почему это значение вам кажется странным? Указатель как указатель, нет?

User avatar
zg
zero-gravity
Posts: 5262
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 43 times
Contact:

Вопросы по использованию FFI

Post by zg » Mon 27 Oct, 2014 15:14

fml2 wrote:Почему это значение вам кажется странным? Указатель как указатель, нет?
потому что это не хэндл.

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

Вопросы по использованию FFI

Post by fml2 » Mon 27 Oct, 2014 16:30

Куда по этому поводу писать (что %p не работает)?

User avatar
zg
zero-gravity
Posts: 5262
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 43 times
Contact:

Вопросы по использованию FFI

Post by zg » Mon 27 Oct, 2014 16:41

fml2 wrote:Куда по этому поводу писать (что %p не работает)?
почему вы решили, что он не работает?

gotar
Posts: 293
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

Ликбез по Lua

Post by gotar » Tue 23 Aug, 2016 16:15

Пытаюсь перевести программу на Си в Lua ffi.
Выполняю код:

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 }                        ║
   ╚═════════════════════════════════════════════════════╝
. В чем проблема и как сделать, чтобы при попытке "выполнить" include файл второй раз синтаксических ошибок не выдавалось.

User avatar
zg
zero-gravity
Posts: 5262
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 43 times
Contact:

Ликбез по Lua

Post by zg » Tue 23 Aug, 2016 16:37

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;"

2useven10
Posts: 3004
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 82 times

Ликбез по Lua

Post by 2useven10 » Tue 23 Aug, 2016 16:45

gotar
В cdef объявления - структуры и ф-ии, исполняемого кода там быть не должно.
Ваши присваивания можно просто перенести в lua код.
Про вторую попытку - имеется ввиду это: viewtopic.php?p=119951#p119951 ?

gotar
Posts: 293
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

Вопросы по использованию FFI

Post by gotar » Tue 23 Aug, 2016 17:16

Теперь у меня ругается на :

Code: Select all

    ╔═════════════════════════════ LuaMacro ══════════════════════════════╗
    ║ \\?\E:\1\pal.lua:19: unexpected symbol near 'LF_FACESIZE' at line 8 ║
    ║ stack traceback:                                                    ║
    ║    [C]: in function 'cdef'                                          ║
    ║    \\?\E:\1\pal.lua:19: in main chunk                               ║
    ╟─────────────────────────────────────────────────────────────────────╢
    ║                               { OK }                                ║
─   ╚═════════════════════════════════════════════════════════════════════╝
Поиск гуглом на LF_FACESIZE не дал определения этой константы. В winapi.lua ее тоже нет. Может кто нибудь найдет у себя чему она равна.

Post Reply

Return to “Нужна помощь”