CLisp 29:调用C程序之回调函数
来源:互联网 发布:类似萝莉云的软件 编辑:程序博客网 时间:2024/05/01 05:19
从LISP中调用C代码,再从C代码回调LISP的函数。有三种方式:通过输入参数传递函数指针;通过外部变量传递函数指针;编译时静态链接。
先看第一种方式,通过参数传递函数指针。
typedef int (*LispFunc) (int);
__declspec(dllexport)
int CallLispFunc1(int x, int y, LispFunc f)
{
if (f) return f(x) * f(y);
else return x * y;
}
在LISP定义一个函数类型,避免定义外部函数时参数太长
(def-c-type fcallback (ffi::c-function (:arguments (number int)) (:return-type int))))
(def-call-out call1 (:name “CallLispFunc1”)
(:return-type int)
(:arguments (x int) (y int) (f fcallback)))
(defun foo (x) (+ x 1)) 被C调用的函数
(call1 3 4 #’foo) => 20
再看第二种方式,通过外部变量传递函数指针。
__declspec(dllexport)
LispFunc pf = 0; 前面定义了LispFunc类型
int CallLispFunc2(int x, int y)
{
if (pf) return pf(x) * pf(y);
else return x * y;
}
(def-call-out call2 (:name “CallLispFunc2”)
(:return-type int)
(:arguments (x int) (y int))
(call2 3 4) => 12 此时没有设置函数指针
(def-c-var pf fcallback) 外部变量,函数指针
(setf pf #’foo) 设置函数指针,注意是setf,不是setq
(call2 3 4) => 20
第三种方式在Windows上没有试成功,找不到需要的文件。
extern int LispCallBack (int);
int CallLispFunc3(int x, inty)
{
return LispCallBack (x) * LispCallBack (y);
}
上面的C代码不能通过链接,因为找不到函数LispCallBack。需要写一个LISP文件,编译LISP文件后生成另一个C文件,此C文件中带有函数LispCallBack。
(defpackage "ffi-test" (:use "COMMON-LISP" "FFI"))
(in-package "ffi-test")
(eval-when (compile) (setq ffi::*output-c-functions* t))
(def-call-in LispCallBack
(:arguments (n int))
(:return-type int)
(:language :stdc))
(defun LispCallBack (x)
(+ x 1))
编译上面LISP文件,假设文件名为c2.lisp,编译后生成c2.c文件。
lisp.exe -M fulllisp.mem -q -c c2.lisp
c2.c文件的主要部分如下,不是全部。包含了clisp.h文件,该文件在clisp/linkkit目录下,但它是Linux下的文件,在Windows下编译会报错。首先是没有文件<stdbool.h>,注释掉后又冒出更多的编译错误。即使解决了编译文件,链接时又会找不到funcall函数,Windows下找不到对应的DLL文件。
#include "clisp.h"
int (lispcallback) (int g3553)
{
begin_callback();
pushSTACK(sint_to_I(g3553));
funcall(module__zz__object_tab[0],1);
{
int retval;
if (sint_p(value1)) *&retval=I_to_sint(value1); else error_sint(value1);
end_callback();
return retval;
}
}
- CLisp 29:调用C程序之回调函数
- CLisp 30:调用C程序之外部变量
- CLisp 31:调用C程序之外部函数
- CLisp 28:调用C程序详细指导
- C# 调用C/C++回调函数
- C#调用C回调函数后,程序奔溃问题
- c调用有参回调函数
- C/C++回调函数之初探
- c/c++编程之回调函数
- C/C++之回调函数
- C/C++之回调函数解析
- C/C++之回调函数
- C/C++之回调函数
- C/C++之回调函数
- C/C++之回调函数
- C/C++之回调函数
- C学习之回调函数
- C/C++之回调函数
- HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的
- 安装CRS-Failureat final check of Oracle CRS stack错误处理
- SQL2005 用户sa登录失败,解决方案汇总
- 《partner4java 讲述jBPM4》之第二步:描述工作流程 & 处理工作流程
- MyLinkedList(链表的实现)
- CLisp 29:调用C程序之回调函数
- C#委托和事件
- onsubmit阻止form表单提交与onclick的相关操作
- Android postTranslate和preTranslate的理解
- Java基础_内存分析_分析代码
- 2013年1月16日 OutOfMemory.CN 进展
- 黑马程序员_Java Annotation学习
- 北漂周记--第3记--概要设计
- win7 硬盘安装fedora 18