2017-05-24 22 views
0

我开发的C#WPF应用程序,它使用CLIPS专家系统引擎在一些parts.I的使用哪个加里开发的CLIPSCRLWrapper.dll 。 这里是我的C#代码:为什么CLIPS eval函数没有在CLIPSCRLWrapper.dll因为它在IDE工作同

clips.Load("ATC.clp"); 
clips.Eval("(Clear)"); 
clips.Reset(); 
clips.Run(); 
sring evalStr="(find-all-facts ((?f ATCOutPut)) TRUE)"; 
FactAddressValue fv =(FactAddressValue)((MultifieldValue)clips.Eval(evalStr))[0]; 

但是,粉碎在最后一行code.and调试运行后的项目,我觉得在程序运行到这一代码片段:

if(rc==0) 
{ 
std::string excStr="Eval: Invalid expression"; 
excStr.appennd(evalString); 
throw std::logic_error(excStr); 
} 

然而,当我加载 “ATC.clp” 在IDE中,键入“(找到-ALL-事实((?F的ATCOutPut))TRUE)”,则返回

实况1

,我也读了“clips_dotnet_010”代码加里发布,C#代码上面相差无几与Gary's.But矿只是crushed.I不知道为什么。

所以,同样的eval字符串得到不同势的结果INT DLL和IDE。 请帮我,我怎样才能在IDEPSCRLWrapper.dll中获得与IDE相同的结果?

而且,在“ATC.clp”像下面的代码:

clips.Eval("(Clear)"); 

有剪辑中没有命令名为清除大写的C:

(deftemplate ATCOutPut 
(slot name (type SYMBOL)(default nil)) 
(slot end (type STRING)(default "")) 
(slot planetype(type STRING)(default "")) 
(slot landingtype(type STRING)(default "")) 
(slot value (type NUMBER)(default 5000)) 
(slot ID(type INTEGER)(default 0)) 
) 

(deffacts InitATC 
(ATCOutPut (name NONE)) 
) 

回答

0

从代码中删除此行。如果你的意图是通过Eval方法在CLIPS中调用clear命令,那么在你加载结构之后做到这一点是没有意义的,你可以使用“clips.Clear();”来做到这一点。方法调用,而不是调用Eval方法。

+0

但是,它不工作,刚刚在最后一行中被压碎:“FactAddressValue fv =(FactAddressValue)((MultifieldValue)clips.Eval(evalStr))[0];”,我已经在这工作了好几天,仍然无法成功。所以,你是我唯一的希望。 –

+0

最可能的解释是您的规则未加载,因为程序的工作目录与规则文件所在的目录不同。 –

+0

我终于找到了问题,那是我使用Windows 10.当我复制项目到Win7时,它编译成功。谢谢你的关注。 –

相关问题