Я интегрировал CLIPS с VC ++ (MFC), поэтому некоторые функции не выполняются, например & quot; strcmp & quot;

Я использовал версию CLIPS6.30, и способ, которым я встраивал CLIPS в VC ++, был похож на образец wrappedDLLExample, показанный в «advance.doc» (с использованием CLIPSWind32.lib и CLIPSWin32CPP.lib).

Когда я пишу класс myCLIPSCPPRouter, мне нужно сравнить логические имена. Но функция «strcmp» не работает. Строка кода была пропущена.

int myCLIPSRouter::Query(CLIPSEnv *cEnv,char *logicalName)
{
int n = strcmp(logicalName,m_lName); //Line (1)
if(strcmp(logicalName,m_lName) == 0)
return TRUE;
else
return FALSE;
}

Линия (1) всегда будет отправлена. И независимо от того, являются ли эти две строки (logicName и m_lName) одинаковыми или нет, они идут в конец функции, т. Е. Функция «strcmp ()» не выполняется. Так странно *! (Я писал «раньше речь шла о« возврате ЛОЖЬ ». Это было неправильно.») *
И нет никаких ошибок с этими двумя строками. Я изменил оба на «ABC», и не имеет значения.

Я пробовал другой метод, например преобразование char * в CString, а затем вызов str.compareNoCase (). Но он также пропущен.

Я думаю, может быть, способ, которым я использую CLIPSRouter, неправильный. Я просто хочу сделать сообщение о том, что «распечатка» CLIPS может отображаться в окне редактирования диалогового окна. Если вы знакомы с интеграцией CLIPS, скажите, пожалуйста, правильный путь. Спасибо очень очень очень большое !!!!

2

Решение

Похоже, что вы используете бета-версию CLIPS 6.30, а не версию выпуска (clips_windows_projects_630.zip из http://sourceforge.net/projects/clipsrules/files/CLIPS/6.30/). DLL не раскрывает функциональность маршрутизатора, поэтому неясно, как вы могли бы заставить свой код компилироваться, если вы встраиваете CLIPS таким же образом, как WrappedDLLExample.

В следующем коде показано, как настроить простой маршрутизатор печати при использовании SimpleLibExample. Он окружает каждую строку текста для печати в <> так что вы можете легко увидеть, что это вызывается:

#include "clipscpp.h"
using namespace CLIPS;

static char *m_lName = "abc";

class myCLIPSRouter : public CLIPSCPPRouter
{
public:
virtual int Query(CLIPSCPPEnv *,const char *);
virtual int Print(CLIPSCPPEnv *,const char *,const char *);
};

int main()
{
CLIPSCPPEnv theEnv;
myCLIPSRouter theRouter;

theEnv.AddRouter("myRouter",100,&theRouter);
theEnv.Build("(defrule hello""   =>""  (printout abc \"Hello World.\" crlf)""  (printout abc \"Hit return to end.\" crlf)""  (readline))");
theEnv.Reset();
theEnv.Run(-1);

return 0;
}

int myCLIPSRouter::Query(CLIPSCPPEnv *cEnv,const char *logicalName)
{
int n = strcmp(logicalName,m_lName);
if(strcmp(logicalName,m_lName) == 0)
return 1;
else
return 0;
}

int myCLIPSRouter::Print(CLIPSCPPEnv *cEnv,const char *logicalName,const char *output)
{
printf("<%s>",output);
return 1;
}

Тот же код может также работать с WrappedDLLExample, но API-интерфейсы маршрутизатора должны быть представлены в DLL. Обновления кода для этого проверены в репозитории SVN здесь: http://sourceforge.net/p/clipsrules/code/HEAD/tree/microsoft_windows/Source/Integration/. Вам нужно будет перекомпилировать DLL и библиотеки (проекты CLIPSDynamic, CLIPSStatic и CLIPSWrapper в решении CLIPS).

1

Другие решения