如何获取这个变量的值
How to get the value of this variable
我正在用 Clips 作为专家系统制作一个应用程序。我想知道是否可以收集 ?result 变量的值,或者如何执行一段代码然后得到结果。
- (void)viewDidLoad {
[super viewDidLoad];
clipsEnv = CreateEnvironment();
if (clipsEnv == NULL) return;
DATA_OBJECT theDO;
EnvEval(clipsEnv,"(bind ?result (numberp (member$ 'Yes' (create$ 'Yes' ))))",&theDO);
}
我上面举的是一个例子。我的应用程序使用了一个很大的.clp,我无法消除变量,因为它用于进行其他计算。
例如我想保留 ?totalDays ?inputDays 和 ?variableResultado 而不修改任何代码。
(bind ?totalDays (+ (* (nth$ 1 (GetDate)) 365)(* (nth$ 2 (GetDate)) (/ 365 12))(nth$ 3 (GetDate))))(bind ?inputDays (+ (* (- (Decimal (sub-string 7 10 ?FechaNacimiento)) 1900) 365)(* (Decimal (sub-string 4 5 ?FechaNacimiento)) (/ 365 12))(Decimal (sub-string 1 2 ?FechaNacimiento))))(bind ?variableResultado (* (/ (- ?totalDays ?inputDays) 365) 12))
回答我自己的问题。一种可能的解决方案是在外部文件中定义一个全局变量而不是普通变量,然后用 EnvFindDefglobal()
和 EnvGetDefglobalValue()
得到结果。这是我找到的可能方法之一。
clipsEnv = CreateEnvironment();
EnvReset(clipsEnv);
if (clipsEnv == NULL){
string = @"Error";
return string;
}
filePath = [[NSBundle mainBundle] pathForResource: @"try" ofType: @"clp"];
cFilePath = (char *) [filePath UTF8String];
EnvLoad(clipsEnv,cFilePath);
DATA_OBJECT theDO;
EnvFindDefglobal(clipsEnv, "?*variable*");
EnvGetDefglobalValue(clipsEnv, "variable", &theDO);
string = [NSString stringWithUTF8String:ValueToString(GetValue(theDO))];
return string;
在 try.clp 文件中:
(bind ?result (numberp (member$ 'Yes' (create$ 'Yes' ))));
(defglobal ?*variable* = ?result);
您无需将函数的 return 值绑定到变量即可使用 EnvEval 检索它:
void *clipsEnv;
DATA_OBJECT theDO;
const char *theString;
clipsEnv = CreateEnvironment();
EnvEval(clipsEnv,"(numberp (member$ 'Yes' (create$ 'Yes' )))",&theDO);
theString = DOToString(theDO);
我正在用 Clips 作为专家系统制作一个应用程序。我想知道是否可以收集 ?result 变量的值,或者如何执行一段代码然后得到结果。
- (void)viewDidLoad {
[super viewDidLoad];
clipsEnv = CreateEnvironment();
if (clipsEnv == NULL) return;
DATA_OBJECT theDO;
EnvEval(clipsEnv,"(bind ?result (numberp (member$ 'Yes' (create$ 'Yes' ))))",&theDO);
}
我上面举的是一个例子。我的应用程序使用了一个很大的.clp,我无法消除变量,因为它用于进行其他计算。
例如我想保留 ?totalDays ?inputDays 和 ?variableResultado 而不修改任何代码。
(bind ?totalDays (+ (* (nth$ 1 (GetDate)) 365)(* (nth$ 2 (GetDate)) (/ 365 12))(nth$ 3 (GetDate))))(bind ?inputDays (+ (* (- (Decimal (sub-string 7 10 ?FechaNacimiento)) 1900) 365)(* (Decimal (sub-string 4 5 ?FechaNacimiento)) (/ 365 12))(Decimal (sub-string 1 2 ?FechaNacimiento))))(bind ?variableResultado (* (/ (- ?totalDays ?inputDays) 365) 12))
回答我自己的问题。一种可能的解决方案是在外部文件中定义一个全局变量而不是普通变量,然后用 EnvFindDefglobal()
和 EnvGetDefglobalValue()
得到结果。这是我找到的可能方法之一。
clipsEnv = CreateEnvironment();
EnvReset(clipsEnv);
if (clipsEnv == NULL){
string = @"Error";
return string;
}
filePath = [[NSBundle mainBundle] pathForResource: @"try" ofType: @"clp"];
cFilePath = (char *) [filePath UTF8String];
EnvLoad(clipsEnv,cFilePath);
DATA_OBJECT theDO;
EnvFindDefglobal(clipsEnv, "?*variable*");
EnvGetDefglobalValue(clipsEnv, "variable", &theDO);
string = [NSString stringWithUTF8String:ValueToString(GetValue(theDO))];
return string;
在 try.clp 文件中:
(bind ?result (numberp (member$ 'Yes' (create$ 'Yes' ))));
(defglobal ?*variable* = ?result);
您无需将函数的 return 值绑定到变量即可使用 EnvEval 检索它:
void *clipsEnv;
DATA_OBJECT theDO;
const char *theString;
clipsEnv = CreateEnvironment();
EnvEval(clipsEnv,"(numberp (member$ 'Yes' (create$ 'Yes' )))",&theDO);
theString = DOToString(theDO);