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?
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
@ 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
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