2015-03-11 4 views
1

J'essaye d'encapsuler une fonction C++ qui ne prend aucune entrée et retourne le communicateur MPI.Retourne la fonction C++ qui renvoie le communicateur MPI en utilisant Cython

.h

class Foo{ 
public: 
    Foo(MPI_Comm _comm){ 
    _comm = comm; 
    } 
    MPI_Comm getMPIComm(){ 
    return comm 
    } 
    virtual void Foo1() = 0 

J'ai essayé suivante:

source.pyx

cimport mpi4py.MPI as MPI 
from mpi4py.libmpi cimport * 

cdef extern from Foo.h: 
    cdef cppclass Foo: 
     Foo(MPI_Comm _comm) 
     MPI_Comm getMPIComm() 
     void Foo1() 

cdef class pyFoo: 
    cdef Foo *thisptr 
    def __cinit__(self,MPI.Comm _comm): 
     pass 
    def get MPIComm(self): 
     c_comm = self.thisptr.getMPIComm() 
     return <MPI.Comm> c_comm 
    def Foo1(self): 
     pass  

Ce code compilé et je suis capable d'écrire un code python qui hérite de cette classe . Cependant, quand j'ai essayé d'accéder getMPIComm au niveau python, je rencontrais une erreur de segmentation et l'erreur donnée par valgrind est:

Access not within mapped region at address 0x8 

Est-ce que ça veut dire que je ne l'ai pas envelopper getMPIComm() correctement? Est-ce que quelqu'un sait comment je devrais l'aborder?

Répondre

0

Je pense que vous n'allouez jamais *thisptr et obtenant ainsi une violation d'accès en essayant d'appeler getMPIComm là-dessus. Essayez de créer une instance Foo comme suit:

cdef class pyFoo: 
    cdef Foo *thisptr 
    def __cinit__(self,MPI.Comm _comm): 
     self.thisptr = new Foo(_comm) 
    # ... 
+0

Je ne suis pas sûr de savoir comment allouer * thisptr dans ce cas en raison de la fonction virtuelle pure Foo1 et il affiche une erreur de compilation lorsque j'ai essayé de faire l'allocation de pointeur. Est-ce que cela devrait se produire? – user279545

+0

@ user279545: Oui, c'est vrai. Vous ne pouvez pas instancier une classe abstraite. Mais alors vous ne pouvez pas utiliser le 'this'-pointeur du tout. Peut-être que vous devriez envelopper une sous-classe de 'Foo' qui peut être instanciée. Une autre façon est de changer la signature de 'Foo1' à' virtual void Foo1() = {} '. Cela dépend de vos besoins. – user0815

+0

Si je voudrais envelopper une sous-classe de [Foo] dans ce cas, comment pourrais-je faire? Je suis encore assez nouveau à Cython et essayant de comprendre les choses. – user279545