Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13861
- 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
Вопросы по использованию FFI
Latest post of the previous page:
John Doe,
ну да, мой косяк, бесполезные время и эксперименты
хоть опыта с ФФИ стало больше, но этот "опыт ради опыта" опять ..
Проблема была в том была в том что я все иницилаизации-декларации ФФИ перенес (не меняя) из _macroinit.lua в LuaFar_init.lua.
т.е., в скрипт макроса все попадаем уже после этих деклараций, все равно, в обоих вариантах как с макроинит так и луафар_инит.
Все еще непонятно почему ои что это меняет, но как-то так.
В свое оправдание:
1.) Из прошлого опыта ФФИ на переопределения ругался сразу, (впрочем сейчас не уверен что помню)
поэтому я не думал что с этим связано
2.) Был сооблазн решить заменой на char[?], это получилось результативно сразу и быстро, но вот далее ..
3.) не было изменений кода используемого кода ФФИ в последние месяцы
Last edited by citRiks on Thu 21 Jan, 2021 12:16, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Надеюсь что подскажетe, почему ФФИ ругается на такое:
и вот это " : NNN" в Сях означает инициализацию с числом NNN, или что ?
Ашипка:
Code: Select all
ffi.cdef([[
DWORD fDsrHold : 1;
typedef struct {
union {
struct {
ULONG Zone : 28;
ULONG Level : 4;
};
ULONG Value;
};
} SCOPE_ID, *PSCOPE_ID;
Ашипка:
Last edited by citRiks on Tue 27 Apr, 2021 19:58, edited 2 times in total.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Вопросы по использованию FFI
Ругается на
Без этой строки ошибки нет, то есть битовые поля в структурах LuaJIT поддерживает, а вот в отдельной переменной видимо нет.
GCC (без дополнительных ключей) тоже выдаёт ошибку.
DWORD fDsrHold : 1;
Без этой строки ошибки нет, то есть битовые поля в структурах LuaJIT поддерживает, а вот в отдельной переменной видимо нет.
GCC (без дополнительных ключей) тоже выдаёт ошибку.
- HaRT
- Moderator
- Posts: 10866
- Joined: Tue 30 Aug, 2005 17:21
- Has thanked: 221 times
- Been thanked: 358 times
Вопросы по использованию FFI
Откуда вы это взяли? Вне структуры в Си такого нет.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Вопросы по использованию FFI
Shmuel, Спасибо, круто на самом деле.
Узнал про битовые поля в структурах, про это в интернетах много.
А про битовые переменные ничего не нашел, да и в принципе непонятно как переменная может быть со сдвигом в битах?
Но, в скопированном мною коде, оказалось что далее использования fDsrHold и нет.
впрочем далее оказалось что сюрпризы не закончились:
Но наверное тут уже можно закончить попытки оживить этот код, слишком много "чудес" в нем происходит
Узнал про битовые поля в структурах, про это в интернетах много.
А про битовые переменные ничего не нашел, да и в принципе непонятно как переменная может быть со сдвигом в битах?
Но, в скопированном мною коде, оказалось что далее использования fDsrHold и нет.
впрочем далее оказалось что сюрпризы не закончились:
Code: Select all
╔═══════════════════════════════════════════════════════════════════ LuaMacro ═══════════════════════════════════════════════════════════════════╗
║ ...g\Far Manager\Profile\Macros\modules\jit-tcp-srv\aaa.lua:1: declaration specifier expected near 'PTHREAD_START_ROUTINE' ║
║ stack traceback: ║
║ [C]: in function 'cdef' ║
║ ...g\Far Manager\Profile\Macros\modules\jit-tcp-srv\aaa.lua:1: in function 'chunk' ║
Code: Select all
ffi.cdef([[
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
typedef struct _CREATE_THREAD_DEBUG_INFO {
HANDLE hThread;
LPVOID lpThreadLocalBase;
LPTHREAD_START_ROUTINE lpStartAddress;
} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
]])
Вопросы по использованию FFI
отсюда:
https://github.com/stuta/Luajit-Tcp-Ser ... indows.lua
смотрел что оттуда можно для чего-нибудь приспособить.
кое-что преуспел приспособить впрочем:
https://github.com/dr-dba/lua-jit-tcp-srv/
на остальное думаю что забью пока.
Last edited by citRiks on Wed 28 Apr, 2021 01:07, edited 3 times in total.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Вопросы по использованию FFI
А зачем это? Экономия аж одной строчки на макрофайл, успешно делающая его нерабочим на обычной нормальной системе.
Вопросы по использованию FFI
было время когда я полагал что повторные require("ffi") делают какие-то проблемы.
сейчас проверил, вроде не делает проблем, вернул все require("ffi") в репозиторий.
Но в любом случае проблема для "обычной нормнальной системе" будет связана с этим:
Code: Select all
╔═══════════════════════════════════════════════════ LuaMacro ═══════════════════════════════════════════════════
║ ...ar Manager\Profile\Macros\modules\jit-tcp-srv\WTypes.lua:397: attempt to redefine '_LARGE_INTEGER' at line 2
║ stack traceback:
║ [C]: in function 'require'
║ [string "LE(require("jit-tcp-srv.lib_util"))"]:1: in main chunk
_LARGE_INTEGER
уже defined,и я должен убрать
_LARGE_INTEGER
там где он еще раз defined
.А на других системх, невозможно будет знать что уже
defined
а что еще нет.По-крайней мере, я не знаю как это узнать.
Если у вас есть какие-то идеи или решения для этого, то буду рад услышать конечно
Вопросы по использованию FFI
Впрочем не откажусь попробоват; разобраться еще раз,
если у кого-то есть идеи как этот
PTHREAD_START_ROUTINE
можно вылечить- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Вопросы по использованию FFI
В теме же есть. В шапке даже (зачем-то).
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Ну нельзя, - так нельзя, я же не настаиваю что можно ..1. Любое определение, сделанное посредством ffi.cdef, действует до конца сеанса.
Переопределить его невозможно: будет действовать определение, сделанное первым.
PS
Ну существует (или .. ?) думаю что возможность попытаться определить в cdef(...),
если падаем, - то ловим exception чтобы не вылететь, и просто едем дальше.
но тогда это будет многовато работы чтобы разбить все определения на такие куски.
А значит без особой на то надобности (которую я пока не вижу) нет смысла так делать
Last edited by citRiks on Wed 28 Apr, 2021 20:53, edited 2 times in total.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Вопросы по использованию FFI
На мой взгляд, правильный подход, это:
- Разместить все вызовы ffi.cdef в одном или более модулях. То есть убрать эти вызовы из макрофайлов. В макрофайлах использовать require().
- Модули проконтролировать на отсутствие дубликатных вызовов.
- Поместить в любой из макрофайлов код
- Разместить все вызовы ffi.cdef в одном или более модулях. То есть убрать эти вызовы из макрофайлов. В макрофайлах использовать require().
- Модули проконтролировать на отсутствие дубликатных вызовов.
- Поместить в любой из макрофайлов код
package.nounload[<modulename>] = true
для каждого модуля.- buniak_a_h
- Posts: 4268
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Вопросы по использованию FFI
Так действительно было, решение - добавление ffi в какой-то список - то ли в список package.preload, то ли в package.nounload (уже не помню). Потом что-то изменилось…
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Вопросы по использованию FFI
Повторные require("ffi") никогда не вызывали проблемы.buniak_a_h wrote: ↑Wed 28 Apr, 2021 22:08Так действительно было, решение - добавление ffi в какой-то список - то ли в список package.preload, то ли в package.nounload (уже не помню). Потом что-то изменилось…
Проблемы возникают из-за того, что некоторые модули (например lpeg) не любят перезагрузки, видимо из-за внутренних дефектов.
Изменение в LuaMacro, о котором вы говорите, было в мае 2013, но оно не имело отношения к require "ffi".