我是否以正确的方式更改 defglobal 的值?
Do I change the value of a defglobal in a correct way?
我正在编写一个应用程序,它应该在某个时候获取 defglobal 变量的值并更改它。为此,我执行以下操作:
DATA_OBJECT cur_time_q;
if (!EnvGetDefglobalValue(CLIEnvironment, cur_timeq_kw, &cur_time_q)) return CUR_TIME_GLBVAR_MISSING;
uint64_t cur_time = t_left;
SetType(cur_time_q, INTEGER);
void* val = EnvAddLong(CLIEnvironment, cur_time);
SetValue(cur_time_q, val);
EnvSetDefglobalValue(CLIEnvironment, cur_timeq_kw, &cur_time_q);
我部分采用了 "Advanced Programming Guide" 的这种方法,效果很好,但我有一些问题:
- 是否
EnvAddLong(...)
添加一个值,该值会保留在内存中,直到环境被破坏?它可能会消耗内存并增加其他 API 函数的执行时间,例如 EnvRun(...)
,如果调用具有此代码片段的函数,比如说,几千次迭代?
- 是不是太过分了?我应该选择
EnvEval("(bind ...)")
之类的东西吗?
CLIPS 高级编程指南中有关于 CLIPS 如何处理垃圾收集的信息。 API 用于创建值以传递给其他 API 函数的 EnvAddLong 调用不会触发垃圾回收。通常,API 导致代码执行或释放数据结构(例如 运行、Reset、Clear 和 Eval)的调用会触发垃圾回收,并将释放由 EnvAddLong 等函数创建的任何瞬态数据。因此,如果您的程序设计反复为全局变量赋值然后运行,那么一旦数据被确认为垃圾并且不再被任何 CLIPS 数据结构引用,您分配的任何 CLIPS 数据结构最终将被释放。
如果您可以轻松构造一个字符串以传递给 Eval 函数,那么这样做通常比多次 API 调用来获得相同结果更容易。
API 在 6.4 版中进行了大修,因此许多任务(例如为 defglobal 赋值)可以通过一步而不是几步完成。
CLIPSValue rv;
Defglobal *global;
mainEnv = CreateEnvironment();
Build(mainEnv,"(defglobal ?*x* = 3.1)");
Eval(mainEnv,"?*x*",&rv);
printf("%lf\n",rv.floatValue->contents);
global = FindDefglobal(mainEnv,"x");
if (global != NULL)
{
DefglobalSetInteger(global,343433);
Eval(mainEnv,"(println ?*x*)",NULL);
DefglobalGetValue(global,&rv);
printf("%lf\n",rv.floatValue->contents);
}
我正在编写一个应用程序,它应该在某个时候获取 defglobal 变量的值并更改它。为此,我执行以下操作:
DATA_OBJECT cur_time_q;
if (!EnvGetDefglobalValue(CLIEnvironment, cur_timeq_kw, &cur_time_q)) return CUR_TIME_GLBVAR_MISSING;
uint64_t cur_time = t_left;
SetType(cur_time_q, INTEGER);
void* val = EnvAddLong(CLIEnvironment, cur_time);
SetValue(cur_time_q, val);
EnvSetDefglobalValue(CLIEnvironment, cur_timeq_kw, &cur_time_q);
我部分采用了 "Advanced Programming Guide" 的这种方法,效果很好,但我有一些问题:
- 是否
EnvAddLong(...)
添加一个值,该值会保留在内存中,直到环境被破坏?它可能会消耗内存并增加其他 API 函数的执行时间,例如EnvRun(...)
,如果调用具有此代码片段的函数,比如说,几千次迭代? - 是不是太过分了?我应该选择
EnvEval("(bind ...)")
之类的东西吗?
CLIPS 高级编程指南中有关于 CLIPS 如何处理垃圾收集的信息。 API 用于创建值以传递给其他 API 函数的 EnvAddLong 调用不会触发垃圾回收。通常,API 导致代码执行或释放数据结构(例如 运行、Reset、Clear 和 Eval)的调用会触发垃圾回收,并将释放由 EnvAddLong 等函数创建的任何瞬态数据。因此,如果您的程序设计反复为全局变量赋值然后运行,那么一旦数据被确认为垃圾并且不再被任何 CLIPS 数据结构引用,您分配的任何 CLIPS 数据结构最终将被释放。
如果您可以轻松构造一个字符串以传递给 Eval 函数,那么这样做通常比多次 API 调用来获得相同结果更容易。
API 在 6.4 版中进行了大修,因此许多任务(例如为 defglobal 赋值)可以通过一步而不是几步完成。
CLIPSValue rv;
Defglobal *global;
mainEnv = CreateEnvironment();
Build(mainEnv,"(defglobal ?*x* = 3.1)");
Eval(mainEnv,"?*x*",&rv);
printf("%lf\n",rv.floatValue->contents);
global = FindDefglobal(mainEnv,"x");
if (global != NULL)
{
DefglobalSetInteger(global,343433);
Eval(mainEnv,"(println ?*x*)",NULL);
DefglobalGetValue(global,&rv);
printf("%lf\n",rv.floatValue->contents);
}