我把CLIPS和VC++(MFC)集成了,为什么有些功能没有执行,比如"strcmp"
I have integrated CLIPS with VC++(MFC), why there are some function does't execute,such as "strcmp"
我使用的是 CLIPS6.30 版本,我将 CLIPS 嵌入 VC++ 的方式就像 "advance.doc" 中显示的 wrappedDLLExample(使用 CLIPSWind32.lib 和 CLIPSWin32CPP.lib).
当我写一个class myCLIPSCPRouter 时,我需要比较logicalNames.But 函数"strcmp" 不起作用。代码行被跳过。
int myCLIPSRouter::Query(CLIPSEnv *cEnv,char *logicalName)
{
int n = strcmp(logicalName,m_lName); //Line (1)
if(strcmp(logicalName,m_lName) == 0)
return TRUE;
else
return FALSE;
}
第 (1) 行将始终发货。而不管这两个字符串(logicalName和m_lName)是否相同,它都会走到函数的最后,ie.the "strcmp()"不执行。太奇怪了*!(我写了 "it goes to 'return FALSE' formerly.it was wrong.")*
而且这两个字符串没有错误。我已将两者都更改为 "abc",但没有任何区别。
我尝试过其他方法,比如将char*转换为CString,然后调用str.compareNoCase()。但也被跳过了。
我想可能是我使用CLIPSRouter的方式不对。我只是想说CLIPS "printout" 可以显示在Dialog.If 的编辑框上,你熟悉CLIPS 集成,请告诉我正确的方法。非常非常非常感谢!!!
看起来您使用的是 CLIPS 6.30 的测试版,而不是发行版(clips_windows_projects_630.zip 来自 http://sourceforge.net/projects/clipsrules/files/CLIPS/6.30/)。 DLL 不公开路由器功能,因此如果您以与 WrappedDLLExample 相同的方式嵌入 CLIPS,则不清楚如何编译代码。
以下代码演示了如何在使用 SimpleLibExample 时设置简单的打印路由器。它包围着要在 <> 中打印的每个文本字符串,以便您可以轻松地看到它正在被调用:
#include "clipscpp.h"
using namespace CLIPS;
static char *m_lName = "abc";
class myCLIPSRouter : public CLIPSCPPRouter
{
public:
virtual int Query(CLIPSCPPEnv *,const char *);
virtual int Print(CLIPSCPPEnv *,const char *,const char *);
};
int main()
{
CLIPSCPPEnv theEnv;
myCLIPSRouter theRouter;
theEnv.AddRouter("myRouter",100,&theRouter);
theEnv.Build("(defrule hello"
" =>"
" (printout abc \"Hello World.\" crlf)"
" (printout abc \"Hit return to end.\" crlf)"
" (readline))");
theEnv.Reset();
theEnv.Run(-1);
return 0;
}
int myCLIPSRouter::Query(CLIPSCPPEnv *cEnv,const char *logicalName)
{
int n = strcmp(logicalName,m_lName);
if(strcmp(logicalName,m_lName) == 0)
return 1;
else
return 0;
}
int myCLIPSRouter::Print(CLIPSCPPEnv *cEnv,const char *logicalName,const char *output)
{
printf("<%s>",output);
return 1;
}
相同的代码也可以与 WrappedDLLExample 一起使用,但路由器 API 需要在 DLL 中公开。在此处的 SVN 存储库中检查了执行此操作的代码更新:http://sourceforge.net/p/clipsrules/code/HEAD/tree/microsoft_windows/Source/Integration/。您需要重新编译 DLL 和库(CLIPS 解决方案中的 CLIPSDynamic、CLIPSStatic 和 CLIPSWrapper 项目)。
我使用的是 CLIPS6.30 版本,我将 CLIPS 嵌入 VC++ 的方式就像 "advance.doc" 中显示的 wrappedDLLExample(使用 CLIPSWind32.lib 和 CLIPSWin32CPP.lib).
当我写一个class myCLIPSCPRouter 时,我需要比较logicalNames.But 函数"strcmp" 不起作用。代码行被跳过。
int myCLIPSRouter::Query(CLIPSEnv *cEnv,char *logicalName)
{
int n = strcmp(logicalName,m_lName); //Line (1)
if(strcmp(logicalName,m_lName) == 0)
return TRUE;
else
return FALSE;
}
第 (1) 行将始终发货。而不管这两个字符串(logicalName和m_lName)是否相同,它都会走到函数的最后,ie.the "strcmp()"不执行。太奇怪了*!(我写了 "it goes to 'return FALSE' formerly.it was wrong.")* 而且这两个字符串没有错误。我已将两者都更改为 "abc",但没有任何区别。
我尝试过其他方法,比如将char*转换为CString,然后调用str.compareNoCase()。但也被跳过了。
我想可能是我使用CLIPSRouter的方式不对。我只是想说CLIPS "printout" 可以显示在Dialog.If 的编辑框上,你熟悉CLIPS 集成,请告诉我正确的方法。非常非常非常感谢!!!
看起来您使用的是 CLIPS 6.30 的测试版,而不是发行版(clips_windows_projects_630.zip 来自 http://sourceforge.net/projects/clipsrules/files/CLIPS/6.30/)。 DLL 不公开路由器功能,因此如果您以与 WrappedDLLExample 相同的方式嵌入 CLIPS,则不清楚如何编译代码。
以下代码演示了如何在使用 SimpleLibExample 时设置简单的打印路由器。它包围着要在 <> 中打印的每个文本字符串,以便您可以轻松地看到它正在被调用:
#include "clipscpp.h"
using namespace CLIPS;
static char *m_lName = "abc";
class myCLIPSRouter : public CLIPSCPPRouter
{
public:
virtual int Query(CLIPSCPPEnv *,const char *);
virtual int Print(CLIPSCPPEnv *,const char *,const char *);
};
int main()
{
CLIPSCPPEnv theEnv;
myCLIPSRouter theRouter;
theEnv.AddRouter("myRouter",100,&theRouter);
theEnv.Build("(defrule hello"
" =>"
" (printout abc \"Hello World.\" crlf)"
" (printout abc \"Hit return to end.\" crlf)"
" (readline))");
theEnv.Reset();
theEnv.Run(-1);
return 0;
}
int myCLIPSRouter::Query(CLIPSCPPEnv *cEnv,const char *logicalName)
{
int n = strcmp(logicalName,m_lName);
if(strcmp(logicalName,m_lName) == 0)
return 1;
else
return 0;
}
int myCLIPSRouter::Print(CLIPSCPPEnv *cEnv,const char *logicalName,const char *output)
{
printf("<%s>",output);
return 1;
}
相同的代码也可以与 WrappedDLLExample 一起使用,但路由器 API 需要在 DLL 中公开。在此处的 SVN 存储库中检查了执行此操作的代码更新:http://sourceforge.net/p/clipsrules/code/HEAD/tree/microsoft_windows/Source/Integration/。您需要重新编译 DLL 和库(CLIPS 解决方案中的 CLIPSDynamic、CLIPSStatic 和 CLIPSWrapper 项目)。