1

私は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クラスの宣言に問題はありません。

ありがとう、

4

1 に答える 1

0

このようにインスタンス メソッドにポインターを渡すことはできません。おそらく、addSensorInterpTask() に渡すための C 関数ラッパーを作成する必要があります。ロボットが間違ったパラメーターでメソッドを呼び出すため、これが問題の原因のようです。また、PlException をキャッチして、その内容を確認する必要があります。とにかく、あなたの例は不完全 (ArRobot とは何ですか?) で不正確 (ashley vs sara) であるため、そのままコンパイルすることはできません。質問を送信する前に、他の人が問題を簡単に再現できる方法を想像してみてください。

于 2010-04-22T12:29:16.417 に答える