2010-04-22 60 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