2015-08-18 65 views
1

我試圖運行用C++編寫的代碼,它應該與我在Python中使用的代碼相同。他們都使用Fenics。如何將Python轉換爲C++?

我的問題是,我不能將Python類翻譯成C++類。

例如,我的Python代碼是:

V = VectorFunctionSpace(mesh, "Lagrange", 1) 
u = Function(V) 
En = 5*dx - dot(3, u)*ds(2) 

def f(self, x): 
    u.vector()[:] = x 
    return assemble(En) 

的這裏的問題是,編譯器不能找到恩,因爲它沒有定義在類內部。

我的C++代碼:

double f(const GenericVector& x) 
{ 
    u.vector() = x; 
    return assemble(F); 
} 

int main() 
{ 
    //...things that apparently work... 
    Function u(Vh); 
    MyClass::BilinearForm F; 

} 

我怎樣才能解決這個問題?

+0

它怎麼能夠找到'u'? – ballsatballsdotballs

+2

Python片段中也沒有定義'u'和'En'。請給出一個[最小完整的可驗證示例](http://stackoverflow.com/help/mcve)。 –

+0

不是。這是另一個編譯器錯誤。 'En'和'u'在main中定義,我不能將它們傳遞給類,因爲f是具有固定簽名的虛擬方法。 –

回答

4

C++擁有全局變量,它們與Python具有全局變量相同。

如果你想訪問你的類外定義的東西,無論是與它的類名前綴並使其靜態(MyClass::Thingy),使其成爲一個全球性的,給它一個訪問功能(MyInstance.GetThingy()),或者通過它直接作爲對使用它的函數的一個參數。

0

作爲衆多方法中的一種,你可以簡單地定義嘗試作爲˚F全局變量如下:

... 

MyClass::BilinearForm F; // The global scope 

double f(const GenericVector& x) 
{ 
    u.vector() = x; 
    return assemble(F); 
} 

int main() 
{ 
    //...things that apparently work... 
    Function u(Vh); 
    // you can use F here or call the function f 
    ... 

} 

這裏F是一個全局變量,你可以在此範圍內使用任何方法。我不知道你的類是如何定義的,或者你是否使用自定義命名空間,但是如果BilinearForm是可訪問的類,則可以根據您的實現擺脫範圍分辨率(MyClass::)部分。您還可以將F定義爲static變量,因此如果您可以提供更多詳細信息,我相信您可能會得到更準確的反饋。

希望有幫助!