2010-04-22 6 views
1

Prolog (SWI-cpp.h의 클래스 및 메서드)에 C++ 인터페이스를 사용하고 있습니다. 존은 메리 엠마와 사라 좋아하는 간단한 되돌아 운동의 경우 :클래스 문제 (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 내 개폐 브라켓이 : 내 주요 코드를 실행할 때, 나는 처리되지 않은 예외 오류 메시지가 표시됩니다. 나는 내 프레임, 내 쿼리 등을 가지고있다. 똑같은 코드가 메리와 엠마와 새라를 역 추적하고 프린트한다. 내가 여기에 누락되어 오류 메시지가 표시됩니까?

다음은 코드가해야한다고 생각하는 것입니다. 매리와 엠마와 새라가 한 번씩 인쇄 될 때마다주기가 증가 할 것으로 예상합니다. 그러나 SWI-cpp.h 파일을 자동으로 열고 PlFrame 클래스를 가리 킵니다. 나에게 무엇을 말하려고 하는가? 내 PlFrame 클래스 선언에 잘못된 것이 보이지 않습니다. 당신은이 같은 인스턴스 메서드에 대한 포인터를 전달할 수 없습니다

답변

0

덕분에, 당신은 아마 addSensorInterpTask에 전달하는 C 함수 래퍼를 만들어야합니다(). 이것은 로봇이 잘못된 매개 변수로 메소드를 호출하기 때문에 문제의 근원 인 것 같습니다. 또한, 당신은 PlException을 잡아서 무엇이 당신에게 알려주는지 확인해야합니다. 어쨌든 예제가 그대로 컴파일되지 않습니다 (ArRobot은 무엇입니까?) 및 부정확합니다 (ashley v.s. sara). 질문을 제출하기 전에 다른 사람들이 번거롭지 않게 문제를 재현 할 수있는 방법을 상상해보십시오.

+0

감사 마트. 그것은 내가 지금 바로 잡는 오타였다. ArRobot은 ARIA의 로봇 객체 (http://robots.mobilerobots.com/wiki/Main_Page)를 참조합니다. 오류가 포함되어 있다고 생각되는 코드 스 니펫을 제출했습니다. 당신이 절대적으로 유효한 포인트를 가지고 있지만 전체 코드를 제출하면 (그래서 내 문제를 재현 할 수있을 것입니다.) 시청자를 끌 수도 있습니다. 다른 의견을 확인하고 내가 할 수있는 일을 볼 것입니다. 고맙습니다, – Joshua