2015-08-18 3 views
1

J'essaye d'exécuter un code écrit en C++ qui devrait être le même que celui que j'ai en Python. Ils utilisent tous les deux Fenics.Comment convertir un Python en C++?

Mon problème est que je ne peux pas traduire une classe Python dans une classe C++.

Par exemple, mon code Python est:

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) 

Le problème ici est que le compilateur ne peut pas trouver En car il n'est pas défini à l'intérieur de la classe.

Mon C++ Code:

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

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

} 

Comment puis-je résoudre ce problème?

+0

Comment peut-il trouver «u»? – ballsatballsdotballs

+2

Ni 'u' ni' En' ne sont définis dans le fragment Python. Veuillez donner un [exemple vérifiable complet minimal] (http://stackoverflow.com/help/mcve). –

+0

Ce n'est pas le cas. C'est une autre erreur de compilateur. 'En' et' u' sont définis dans le main et je ne peux pas les passer à la classe car f est une méthode virtuelle avec une signature fixe. –

Répondre

4

C++ a des globales de la même manière que Python a des globales. Si vous voulez accéder à quelque chose de défini en dehors de votre classe, préfixez-le avec son nom de classe et rendez-le statique (MyClass::Thingy), rendez le global, donnez-lui une fonction accesseur (MyInstance.GetThingy()), ou transmettez-le directement comme un argument aux fonctions qui l'utilisent.

0

Comme l'une des nombreuses méthodes, vous pouvez simplement essayer de définir F comme variable globale comme suit:

... 

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 
    ... 

} 

ici F est une variable globale et vous pouvez l'utiliser dans une méthode dans ce cadre. Je ne sais pas comment votre classe est définie ou si vous utilisez un espace de noms personnalisé, mais vous pouvez vous débarrasser de la résolution de la pièce (MyClass::) en fonction de votre implémentation si BilinearForm est une classe accessible ici. Vous pouvez également définir F comme une variable static, donc si vous pouviez fournir plus de détails, je suis sûr que vous pourriez obtenir des commentaires plus précis.

Espérons que ça aide!