私はProlog(SWI-cpp.hのクラスとメソッド)へのC++インターフェースを使用しています。ジョンがメアリーとエマとサラが好きな単純なバックトラックを作成するために:
likes(john, mary).
likes(john, emma).
likes(john, ashley).
私はただすることができます:
{
PlFrame fr;
PlTermv av(2);
av[0] = PlCompound("john");
PlQuery q("likes", av);
while (q.next_solution())
{
cout << (char*)av[1] << endl;
}
}
これは別のコードで機能するため、構文は正しいです。しかし、私はこの単純なバックトラックをクラス内で機能させることも試みています。
class UserTaskProlog
{
public:
UserTaskProlog(ArRobot* r);
~UserTaskProlog();
protected:
int cycles;
char* argv[1];
ArRobot* robot;
void logTask();
};
このクラスは正常に機能し、私のサイクル変数はロボットサイクルごとに増分します。ただし、メインコードを実行すると、未処理の例外エラーメッセージが表示されます。
UserTaskProlog::UserTaskProlog(ArRobot* r) : robotTaskFunc(this, &UserTaskProlog::logTask)
{
cycles = 0;
PlEngine e(argv[0]);
PlCall("consult('myFile.pl')");
robot->addSensorInterpTask("UserTaskProlog", 50, &robotTaskFunc);
}
UserTaskProlog::~UserTaskProlog()
{
robot->remSensorInterpTask(&robotTaskFunc);
// Do I need a destructor here for pl?
}
void UserTaskProlog::logTask()
{
cycles++;
cout << cycles;
{
PlFrame fr;
PlTermv av(2);
av[0] = PlCompound("john");
PlQuery q("likes", av);
while (q.next_solution())
{
cout << (char*)av[1] << endl;
}
}
}
PlFrame用の開閉ブラケットがあります。フレームやクエリなどがあります...mary、emma、saraをバックトラックして出力するのとまったく同じコードです。エラーメッセージが表示されるので、ここで何が欠けていますか?
コードが実行する必要があると思うことは次のとおりです。mary、emma、saraは、サイクルが増えるたびに1回出力されることを期待しています。ただし、SWI-cpp.hファイルを自動的に開き、クラスPlFrameを指します。それは私に何を伝えようとしているのですか?PlFrameクラスの宣言に問題はありません。
ありがとう、