clips嵌入vs项目中
有很多种方法,可以动态链接,静态链接,这些导入lib就可以直接调用clips的接口函数。
本文主要介绍直接将clips源码加入vs项目中,与c++项目整合
源码直接加入项目中后,就不仅可以调用clips的函数执行操作,还可以让clips调用c++项目中的函数,也即外部函数。
1、加入代码
clips源码是C文件,直接加入C++项目中肯定会有问题,下面针对会遇到的问题一一解决。
首先把clips源码除了main.c全部复制过来,.h文件放入头文件文件夹中,.c文件放入源码文件夹中,如何把所有.c文件的后缀名改为.cpp。
此时再编译,会发现提示没有strtoll()函数,这里就在报错的文件的公共引用的一个或几个.h文件中加入
if defined(_MSC_VER)
#define strtoll _strtoi64
#endif
我在envrnmnt.h中加了,此时再编译,就不再报错。
再后面如果对应MFC工程有时会遇到报错
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source?
这个问题一般发生在:通过添加文件的方式,添加了一些cpp文件到一个MFC的程序,但该cpp文件并不是MFC,而是标准的C++。
解决方案: 右键单击项目工程中的cpp文件,在菜单Project->Settings->C/C++->Precompile Header,设置为第一项:Not using precompile headers。
此时再编译,问题解决
2、调用clips函数
调用clips,需要什么功能,查看clips的函数接口,实现即可。
注意在项目文件中加#include “clips.h”
创建环境必不可少,defrule和deftemplate可以在EnvBuild中写,也可以提前写好用load导入
添加事实的话,需要有deftemplate,然后加入。
下面是一个例子,实现插入事实、定义规则、reset等操作,这里test.clp中提前定义了一个(pointData (value %d)(min %d)),采用envload导入的,然后调用EnvAssertString即可插入事实。
//为后面assert事实做准备
int v=5,m=2;
char tempBuffer[50];
sprintf(tempBuffer,"(pointData (value %d)(min %d))",value,min);
void *theEnv;
theEnv = CreateEnvironment();
EnvLoad(theEnv,"test.clp");
EnvBuild(theEnv,"(defrule hello"
" =>"
" (printout t \"Hello World.\" crlf)"
" (printout t \"Hit return to end.\" crlf)"
" (readline))");
EnvReset(theEnv);
EnvAssertString(theEnv,tempBuffer);
EnvRun(theEnv,-