我在尝试在我的iPhone应用程序中加载.clp文件。为此,我使用了下面的代码
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"autodemo" ofType:@"clp"]; environment = CreateEnvironment(); char *clipsFileChar = (char *)[filePath cStringUsingEncoding:NSASCIIStringEncoding]; Load(clipsFileChar); Reset(); Run(-1); NSString *evalS = [NSString stringWithFormat:@"(find-all-facts ((?f state-list)) TRUE)"]; char * evalStr = (char *)evalS; DATA_OBJECT obj;// = {0,-1};// obj.type = STRING;// obj.value = evalStr; int i = Eval(evalStr, &obj); NSLog(@"%d",i);
现在当我运行这段代码时,Eval(evalStr, &obj)
每次都返回0
。
我使用的是来自这个链接的autodemo.clp文件。
那么,如何让Eval()
命令正常工作,以及如何获取clp文件返回的响应?
谢谢,
回答:
下面的代码解决了我的问题,希望能帮助到其他人.. 🙂
InitializeEnvironment();Clear();NSString *filePath = [[NSBundle mainBundle] pathForResource:@"autodemo" ofType:@"clp"];char *clipsFileChar = (char *)[filePath cStringUsingEncoding:NSASCIIStringEncoding];IncrementGCLocks();Load(clipsFileChar);Reset();Run(-1);DecrementGCLocks();[self nextUIState];
- (void)nextUIState{ DATA_OBJECT theDO; NSString * evalS = @"(find-all-facts ((?f state-list)) TRUE)"; char *evalStr = (char *)[evalS cStringUsingEncoding:NSASCIIStringEncoding]; int j = EnvEval(GetCurrentEnvironment(), evalStr, &theDO); NSLog(@"j = %d",j); if(factDict) { [factDict release]; factDict = nil; factDict = [[NSMutableDictionary alloc] init]; } id value = [self objectForDataObject:&theDO]; NSLog(@"%@",[value description]); }
-(id) objectForDataObject: (DATA_OBJECT*) arg{ switch(arg->type) { case FACT_ADDRESS: { DATA_OBJECT data = { 0 }; struct fact* aFact = (struct fact*) arg->value; if(EnvGetFactSlot(GetCurrentEnvironment(),aFact,(char*)[@"current" UTF8String],&data)) { [factDict setObject:[self objectForDataObject: &data] forKey:@"current"]; [factDict retain]; } return factDict; } case SYMBOL: { NSString *str = [NSString stringWithUTF8String: ValueToString(arg->value)]; if ([str isEqual: @"nil"]) return nil; if ([str hasPrefix: @"<<<"] && [str hasSuffix: @">>>"]) { return [self dataFromSymbolString: str]; } return str; } case STRING: { return [NSString stringWithUTF8String: ValueToString(arg->value)]; } case INTEGER: { return [NSNumber numberWithInt: ValueToInteger(arg->value)]; } case FLOAT: { return [NSNumber numberWithDouble: ValueToDouble(arg->value)]; } case EXTERNAL_ADDRESS: { return (id) arg->value; } case MULTIFIELD: { int i, count = GetpDOLength(arg); NSMutableArray *args = [NSMutableArray arrayWithCapacity: count]; FIELD_PTR fptr = (FIELD_PTR) GetMFPtr(GetpValue(arg),GetpDOBegin(arg)); for(i = 0; i < count; ++i, ++fptr) { DATA_OBJECT dobj; dobj.type = fptr->type; dobj.value = fptr->value; [args addObject: [self objectForDataObject: &dobj]]; } return args; } default: return nil; }}
如果你发现其他更好的方法(当然有),请告诉我。 🙂