问题标签 [cffi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
lisp - 通过 CFFI 传递指针以获取结果
这是C中的一个函数:
现在我想通过 CFFI 在 Common Lisp 中调用它,我该怎么做呢?
common-lisp - cffi/外部类型的推荐命名约定
在 common lisp 中,是否有推荐的外部类型命名约定?(和一般类型)?例如:
在此示例defcstruct Point
中对应于 C/C++ 类型struct Point{int32 x, y;};
,glyph-index-t
对应于typedef uint32 GlyphIndex;
并且font-ptr-t
是struct Font*
。
我不确定我是否应该简单地-t
为所有内容添加后缀(就像我对 所做的那样glyph-index-t
),使解释器区分大小写(所以我可以使用大写来指示类型,就像在 C++ 中一样,这可能是一个坏主意),或者是否有是其他一些传统的方法。有什么建议吗?
common-lisp - 如何为简单的 c 库生成 cffi 包装器
我想为 C 库(SOIL)生成一个通用的 lisp cffi 包装器,虽然我对 cl 和 cffi 很有信心,但我不确定要使用哪些库或如何开始使用它们。基本上我会问一个更详细的问题,但不知道我不知道什么。
pointers - Lisp、cffi、let 和内存
我已经构建了一些玩具 C++ 库来从 Lisp 快速创建一个 Qt 窗口。我知道 common-qt 存在,我只是想学习如何使用 cffi。
现在,我有 4 个绑定函数:
- create-application :创建一个 QApplication 并返回一个指针
- create-window : 创建一个 QMainWindow 并返回一个指针
- show :显示指定为参数的窗口
- exec : Qt 执行函数
这是一个完美运行的 lisp 代码:
但是如果我使用 LET 或 LET*...我有内存错误!
有人知道为什么吗?
我正在使用 SBCL:
谢谢。
opencv - 在尝试使用 cffi 将 opencv 函数转换为 lisp 时我做错了什么
opencv函数是cvSmooth,这里是我写的cffi代码
C函数接口:
基本上 +gaussian+ 看起来不像在 opencv 中那样糟糕而且 +bilateral+ 根本不起作用它使我使用它的代码甚至无法运行但其余的工作正常......我做错了什么?
c - 如何在 OpenCV C Inerface 中找出...在什么 .so 中定义了 OpenCV 函数
例如,如果我试图调用 cvNamedWindow ......那么 cvNamedWindow 信息会在什么......请给我信息,这样我就可以自己为任何 C OpenCV 函数跟踪这个信息......我通常 grep 我的 opencv 2.4.6 文件夹,其中包括这些文件夹 3rdparty 应用程序构建 cmake CMakeLists.txt 数据文档包括 index.rst 模块平台 README 示例所以如果你告诉在哪里看,我习惯于这样搜索......我的知识如此远...在highgui文件夹modules/highgui/src/中有一个cvNamedWindow的CV_IMPL,所以我认为它来自那里,但是对cvmGet重复相同的操作不会返回CV_IMPL .....我正在尝试换行cvmGet,我得到一个未定义的外星函数错误......但我包括:
我认为 cvmGet 是加上所有其他 opencv .so 文件
这是针对 Ubuntu 13.10、OpenCV 2.4.6 上的 Lisp
c - 我将如何用 cffi/lisp 包装一个 opencv 宏?
我习惯于包装函数,但我试图包装函数 cvStartWriteSeq 并且它似乎使用宏 - CV_WRITE_SEQ_ELEM - 将元素写入opencv序列......
这是我发现的代码isaw:
我熟悉使用 defcfun 来包装函数,但是在 /modules/core/include/opencv2/core/types_c.h 中我看到了宏,我很好奇我将如何完成任务。这是宏定义...
任何关于我如何做到这一点的指导都将加快获得完整 Lisp opencv 包装器的过程,非常感谢 =)
c - cffi 的 foreign-alloc 列表包含一个 defconstant
我正在尝试做:
但我收到一条错误消息:
我可以定义这一点非常重要:
作为我正在编写的代码的指针。我怎样才能做到这一点?
opencv - 需要有关如何在 lisp 中打印矩阵的建议
我定义了一个矩阵,所以如果我这样做
它打印出第一行第一列中的元素
如果我这样做
它打印出第一行第二列中的元素
如果我这样做
它打印出第二行第一列中的元素。
矩阵a
看起来像这样
我希望你能准确地告诉我如何编写一个dotimes
循环或其他循环,以尽可能少的行将使用该get-real-2d
函数打印出矩阵,因此输出如下所示:
我只是希望你能给我展示一个非常小的光滑循环,我可以用它来打印我可以在我的 lisp 库中使用的矩阵,看起来很专业,比如只使用变量的。就像是:
而不是一堆:
;;;;最新编辑;;; 为了简单起见,我打电话给
创建一个 3x3 矩阵 - create-mat 是 opencv 的 cvCreateMat 的包装器
该命令在 repl 的输出是
i/e 变量 a 是指向 3x3 矩阵的指针
然后我跑
为矩阵创建数据 - 我接下来将分配给矩阵
该命令在 repl 的输出是
i/e 变量 a 是指向数据的数据指针,将添加到矩阵
然后我打电话..
所以现在当我运行时 - (get-real-2d 是 opencv 的 cvGetReal2d 的包装器)
该命令在 repl 的输出是
现在当我跑步时
该命令在 repl 的输出是
当我运行这个循环时
该命令在 repl 的输出是
但是当我尝试你的方法@Svante
我得到错误:
因为 1 次运行 get-real-2d 的输出只是 1 个浮点数 i/e
有了这些信息,你能帮我打印矩阵吗,看起来像这样
c - 使用 cffi-libffi 按值传递结构?
我的印象是 CFFI 不能按值传递结构,但 CFFI 文档说:
要将结构按值传递或返回给函数,请加载 cffi-libffi 系统并将结构指定为
(:struct structure-name)
. 要传递或返回指针,您可以使用:pointer
或(:pointer (:struct structure-name))
。
我正在重新包装 cl-opencv 函数get-size
,它是这个 opencv 函数的包装器:
并且由于当 cl-opencv 的作者编写库时,我认为 CFFI 没有能力通过 cffi-libffi 系统按值传递结构,所以他必须使用以下所有代码来包装cvGetSize
:
鉴于上面引用的 CFFI 文档,我将如何按值传递此cvGetSize
结构CvSize
?
我打算更新cl-opencv包,我想知道在 cl-opencv 包中的何处以及如何根据 CFFI 文档“加载 cffi-libffi 系统”,以及在何处“将结构指定为(:struct structure-name)
”和“使用 :pointer 或 (:pointer (:struct structure-name))”“传递或返回指针。”
我可以使用上面的cvGetSize
包装器来详细说明如何做到这一点:
编辑@Rörd
我很欣赏你的良心回应
无论哪种方式,我都会遇到相同的错误...但是出于测试目的,可以说我像这样将 cffi-libffi 加载到当前会话中(带输出)
它加载,所以我只运行你提供的 defcfun 和 defcstruct (带输出):
我知道 libffi 安装正确,因为加载了 gsll(使用 cffi-libffi)我运行 gsll 测试,它们都通过了这里显示的(带输出)
它似乎没有用 (:struct cv-size) 作为问题来调用 defcfun,因为当我调用它时
我得到同样的错误
我可以像这样运行我的 ipl-image 结构
我的 create-image 包装器现在加载了 cffi-libffi 并且您的 (:struct ipl-image) 运行良好,但...显示输出
创建图像
但是当我跑步时
在 repl 处创建图像没有任何反应,repl 只是挂起......
但是当我使用 ipl-image 而不是 (:struct ipl-image) 运行创建图像包装器时
我可以运行:
很好,然后运行它来访问结构值(带输出)
但我没有得到一个结构值我得到
当我用这个在c中计算出那个值img->colorModel时
所以任何帮助将不胜感激
好的 1 更多编辑:
我又试了一次,它在这里工作是我的输出
不知道我第一次做错了什么,但是...如果您可以检查我的结果并验证我刚刚按值传递了一个结构,我将永远感激不尽
谢谢罗德
好的,如果您仍然有兴趣帮助我调试 Rord,请进行另一个编辑
如果出现错误:
这是导致它的历史(这直接发生在我发布上一个编辑之后,所以我的 emacs 仍然加载了所有上一个编辑代码):
我明白了,因为:
访问你的 defun ...我跟踪它,所以当我运行时 - 显示输出:
我得到错误:
我认为这是因为你的 defcfun 的输出只是一个列表,而 with-foreign-slots 需要一个指针
我跑了这个:
验证,它只是一个列表
顺便说一句,我使用这些功能进行测试
因为有一个更纯粹的输出......创建图像使用我最初发布在顶部的get-size的hackery?
我想使用没有所有hackery的create-image和get-size,并且只使用结构来返回,这样我就可以停止使用make-size并使其更纯粹......所以任何关于它的建议都会成为黄金...这就是我想要创建图像的方式...我只需要让它接受您(Rord's)defcfun的输出...我现在正在尝试打开您的defcfun输出((HEIGHT 480 WIDTH 640)) 指向一个指针......所以它只会在这个
还是整个制造尺寸的东西都是必需品...
也仅供参考我改变了你添加到的defun
现在它可以工作了......如果我把事情搞砸了,如果你的 defun 会更好
编辑!!!!我明白了!!!!
编辑!!!!我都弄明白了!!!!!!!...部分....II - 更好!
@Liam 编辑
好的,我尝试了您的从外国翻译的方法,它确实有效,我在我的 structs.lisp 文件中定义了这些
和 get-size 和 create-image 是这样定义的
这里是 size->int64 的定义
但我喜欢翻译外国定义方法的想法
所以我想知道你是否可以向我展示如何从方法中将以下翻译成外文版本这真的会让我的图书馆唱歌......我的目标是为opencv制作一个完整的cffi包装器和gsll一样好是gsl,所以这真的有助于更快地发生......再次感谢您迄今为止对所有这一切的帮助