从剪辑获取事实列表时获取FACT_ADDRESS数据类型



我将CLIPS嵌入到C语言中。并有代码:

main{
    DATA_OBJECT factlist;
    int end,i;
    void *multifieldPtr;
    char *tempPtr;
    InitializeEnvironment();
    Load("constructs.clp");
    Reset();
    GetFactList(&factlist,NULL);//send facts from clips to c application.   
    end=GetDOEnd(factlist);
    printf("end=%dn",end);
    printf("Lengthis%dn",GetDOLength(factlist));
    multifieldPtr=GetValue(factlist);
    printf("%dn",end);
    for (i = GetDOBegin(factlist); i <= end; i++){
        printf("i=%dn",i);
        if (GetMFType(multifieldPtr,i) == FACT_ADDRESS){
        tempPtr = ValueToString(GetMFValue(multifieldPtr,i));//have problems here 
        printf("%dn",*tempPtr);//have problems here
        }
        else{printf("%dn",GetMFType(multifieldPtr,i));
        }
    }

}

我知道 GetMFType(muntifieldPtr,i)返回FACT_ADDRESS,我想如何从FACT_ADDRESS获取代表事实值的字符串值并将事实打印到屏幕上

更新到最新的剪辑版本(6.30)。

#include "clips.h"  
#define BUFFER_SIZE 1024
int main( int argc, char *argv[]){
DATA_OBJECT factlist;
char factBuffer[BUFFER_SIZE+1];
int end,i;
void *multifieldPtr;
void *theEnv;
theEnv = CreateEnvironment();
EnvBuild(theEnv, "(deffacts initial (colors red green blue) (animals cat dog chicken))");
EnvReset(theEnv);
EnvGetFactList(theEnv,&factlist,NULL);
if (GetType(factlist) == MULTIFIELD)
  {
   end = GetDOEnd(factlist);
   multifieldPtr = GetValue(factlist);
   for (i = GetDOBegin(factlist); i <= end; i++)
     {
      EnvGetFactPPForm(theEnv, factBuffer,BUFFER_SIZE,GetMFValue(multifieldPtr,i));
      printf("%sn",factBuffer);
     }
  }
return(-1);
}

您可以使用以下方法进行编译:

make -f makefile.lib
gcc <source file name> -L./ -lclips -lm -o <executable name>

使用 GetFactPPForm 函数。ValueToString 只能用于DATA_OBJECT的类型是 SYMBOL、STRING 或 INSTANCE_NAME。

#define BUFFER_SIZE 1024
int main(
  int argc,
  char *argv[])
  {
    DATA_OBJECT factlist;
    char factBuffer[BUFFER_SIZE+1];
    int end,i;
    void *multifieldPtr;
    InitializeEnvironment();
    Build("(deffacts initial (colors red green blue) (animals cat dog chicken))");
    Reset();
    GetFactList(&factlist,NULL);
    if (GetType(factlist) == MULTIFIELD)
      {
       end = GetDOEnd(factlist);
       multifieldPtr = GetValue(factlist);
       for (i = GetDOBegin(factlist); i <= end; i++)
         {
          GetFactPPForm(factBuffer,BUFFER_SIZE,GetMFValue(multifieldPtr,i));
          printf("%sn",factBuffer);
         }
      }
   return(-1);
  }

最新更新