2010-04-22 30 views
1

我正在使用Prolog的C++接口(SWI-cpp.h的类和方法)。为制定一个简单的回溯约翰喜欢玛丽和艾玛和Sara:类问题(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 2010-04-22 16:38:38