我把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 项目)。