Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 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
- zg
- zero-gravity
- Posts: 6036
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Re: luajit в фаре
Latest post of the previous page:
а как?Shmuel wrote:В своих библиотеках можно перед вызовом ffi.cdef проверить, определена ли та или иная константа.
Re: luajit в фаре
Это в С такая фишка, что объявление и определение - разные вещи, ЕМНИП. Определения повторять нельзя, объявления можно. Для функций заголовок без тела считается только объявлением, а константы и переменные (даже не инициализированные) считаются определениями, если нет специального ключевого слова externShmuel wrote: LuaJIT FFI рассматривает переопределение статических констант и enum'ов как ошибку. На повторное определение функций почему-то не жалуется.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: luajit в фаре
Да, это так, но при использовании в Lua доставляет неудобства: нельзя (без спец-приседаний) запустить скрипт более 1 раза, нельзя перезагрузить модуль.Acerbic wrote:Это в С такая фишка, что объявление и определение - разные вещи, ЕМНИП. Определения повторять нельзя, объявления можно. Для функций заголовок без тела считается только объявлением, а константы и переменные (даже не инициализированные) считаются определениями, если нет специального ключевого слова extern
-
- Posts: 145
- Joined: Thu 04 Oct, 2012 13:53
- Location: Hamburg, DE
- Has thanked: 2 times
- Been thanked: 2 times
ffi.C и unicode/multibyte ... string
Что-то никак не получается через FFI протолкнуть кириллический текст без потерь, уже даже к методам научного тыка прибегнуть пришлось ...
На примере: MessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT);
Пока пришел к следующему, но в конце текста сообщения мусор, как правильно с ним работать? Последний случай (MessageBoxA) у большинства из вас скорее всего будет работать, т.к. locale у вас "случайно" подходящая...
Благодарю
На примере: MessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT);
Пока пришел к следующему, но в конце текста сообщения мусор, как правильно с ним работать? Последний случай (MessageBoxA) у большинства из вас скорее всего будет работать, т.к. locale у вас "случайно" подходящая...
Благодарю
Re: ffi.C и unicode/multibyte ... string
EGez wrote:-- 2. Вроде работает, но в конце строк мусор
C.MessageBoxW(nil, win.Utf8ToUtf16('Кириллический текст'), win.Utf8ToUtf16('Utf8ToUtf16'), 1)
Code: Select all
C.MessageBoxW(nil, win.Utf8ToUtf16('Кириллический текст\0'), win.Utf8ToUtf16('Utf8ToUtf16\0'), 1)
-
- Posts: 145
- Joined: Thu 04 Oct, 2012 13:53
- Location: Hamburg, DE
- Has thanked: 2 times
- Been thanked: 2 times
Re: ffi.C и unicode/multibyte ... string
Спасибо, сработало.Abs wrote:?Code: Select all
C.MessageBoxW(nil, win.Utf8ToUtf16('Кириллический текст\0'), win.Utf8ToUtf16('Utf8ToUtf16\0'), 1)
Но меня терзают смутные сомнения: Почему jit их автоматически не завершает нулями при передаче в контекст c runtime? Это же стандарт в C/C++, именно поэтому мне и не пришла такая идея в голову.
Это workaround или стандартное поведение? Где-нибудь описано?
Спасибо
- zg
- zero-gravity
- Posts: 6036
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Re: ffi.C и unicode/multibyte ... string
а как он должен догадаться?EGez wrote:Но меня терзают смутные сомнения: Почему jit их автоматически не завершает нулями при передаче в контекст c runtime?
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: ffi.C и unicode/multibyte ... string
LuaJIT обрабатывает то, что ему передано, и это правильно.EGez wrote:Но меня терзают смутные сомнения: Почему jit их автоматически не завершает нулями при передаче в контекст c runtime? Это же стандарт в C/C++, именно поэтому мне и не пришла такая идея в голову.
Это workaround или стандартное поведение? Где-нибудь описано?
Данное поведение проистекает от того, что, в отличие от Си-строк, строки в Lua не содержат завершающего нуля (хотя во внутренностях Lua он имеется, но только один нулевой байт, а не два, как нужно для UTF-16).
-
- Posts: 145
- Joined: Thu 04 Oct, 2012 13:53
- Location: Hamburg, DE
- Has thanked: 2 times
- Been thanked: 2 times
Re: ffi.C и unicode/multibyte ... string
Хм.. Я кажется понял в чем дело. Скорее дело не в том, что Lua не использует zero termination.Shmuel wrote: LuaJIT обрабатывает то, что ему передано, и это правильно.
Данное поведение проистекает от того, что, в отличие от Си-строк, строки в Lua не содержат завершающего нуля (хотя во внутренностях Lua он имеется, но только один нулевой байт, а не два, как нужно для UTF-16).
Поскольку Lua стринги свои не различает на широкие и узкие, в C runtime оно, похоже, передается как char[]/byte[] совершенно не задумываясь о семантике содержимого и все-таки завершенным одним \0 (т.к. char). Поэтому ANSI функции работают нормально... А функция же, которая получает от сего пойнтер параметром, ожидает, что это utf16 и интерпретирует его соответственно, ну и обламывается на одном \0.
Спасибо!
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
ffi.C и unicode/multibyte ... string
Что тут может быть не так?EGez wrote:Что-то никак не получается через FFI протолкнуть кириллический текст без потерь, уже даже к методам научного тыка прибегнуть пришлось ... :(
На примере: MessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT);
Последний случай (MessageBoxA) у большинства из вас скорее всего будет работать, т.к. locale у вас "случайно" подходящая...
Благодарю
Code: Select all
C:\APPs\Far3\lua51x.exe: C:\APPs\Far3\Profile\Macros\2check\ffi\MessageBoxW.lua:13: bad argument #2
to 'MessageBoxW' (cannot convert 'string' to 'const unsigned short *')
stack traceback:
[C]: in function 'MessageBoxW'
C:\APPs\Far3\Profile\Macros\2check\ffi\MessageBoxW.lua:13: in main chunk
[C]: at 0x00407bbc
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: ffi.C и unicode/multibyte ... string
В тексте ошибки ясно сказано, что не так. wchar_t - это unsigned short.John Doe wrote:Что тут может быть не так?
Code: Select all
C:\APPs\Far3\lua51x.exe: C:\APPs\Far3\Profile\Macros\2check\ffi\MessageBoxW.lua:13: bad argument #2 to 'MessageBoxW' (cannot convert 'string' to 'const unsigned short *') stack traceback: [C]: in function 'MessageBoxW' C:\APPs\Far3\Profile\Macros\2check\ffi\MessageBoxW.lua:13: in main chunk [C]: at 0x00407bbc
Почитайте несколько сообщений, начиная от http://forum.farmanager.com/viewtopic.p ... 45#p111545, там есть примеры.
- John Doe
- Бюрократ
- Posts: 13862
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: ffi.C и unicode/multibyte ... string
В данном случае я не пытался освоить FFI, а всего лишь хотел запустить готовый пример из первого сообщения.
Автор представляет его как рабочий, поэтому мне показалось что у меня какая-то проблема с инсталляцией.
Автор представляет его как рабочий, поэтому мне показалось что у меня какая-то проблема с инсталляцией.
-
- Posts: 145
- Joined: Thu 04 Oct, 2012 13:53
- Location: Hamburg, DE
- Has thanked: 2 times
- Been thanked: 2 times
ffi.C и unicode/multibyte ... string
Пардон, я наверху что-то напутал походу с ffi.cdef, оно же второй раз не переопределяется и об ошибке не сообщает, нужно было Фар перегружать.
На самом деле у меня работающий пример выглядит так: Я конечно понимаю, что так делать не совсем чисто, но для машины-то без разницы, будь то char* byte* или short*.
На самом деле у меня работающий пример выглядит так: Я конечно понимаю, что так делать не совсем чисто, но для машины-то без разницы, будь то char* byte* или short*.
- HaRT
- Moderator
- Posts: 10866
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 221 times
- Been thanked: 358 times
Re: ffi.C и unicode/multibyte ... string
Машина машине рознь. На многих RISC-архитектурах у char* и short* почти наверняка будет разное выравнивание, что чревато в лучшем случае просадкой производительности, а в типичном — “unaligned” exception. И да, некоторые из таких машин работают (работали?) под управлением тех или иных Windows.EGez wrote:Я конечно понимаю, что так делать не совсем чисто, но для машины-то без разницы, будь то char* byte* или short*.
Фар есть инструмент, а не нянька. © 2009 DrKnS