2017-05-24 20 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時,它編譯成功。謝謝你的關注。 –

相關問題