如何在MPI中发送std :: string?

mar*_*nah 1 c++ string mpi

我想通过MPI发送一个字符串变量,但我不知道该怎么做!我的代码在这里:

static string  fourTupX="Hello";
Run Code Online (Sandbox Code Playgroud)

现在我想通过MPI发送它:

int l=std::strlen(fourTupX.c_str());
l++;
MPI::COMM_WORLD.Send (&l,1,MPI::INT,1,7);
MPI::COMM_WORLD.Send ( &fourTupX, 1, MPI::CHAR, 1, 1 );
Run Code Online (Sandbox Code Playgroud)

并在另一方接收它:

int l;
 source=0;
 MPI::COMM_WORLD.Recv (&l,1,MPI::INT , source, 7, status1 );
 cout<<l;
 char* myfourTupX=new char[l];
 MPI::COMM_WORLD.Recv (myfourTupX,l,MPI_CHAR , source, 1, status1 );
Run Code Online (Sandbox Code Playgroud)

但收到后,四件套中没有任何东西!问题是什么?

Hri*_*iev 9

您必须发送从中获取的字符串缓冲区的内容c_str().您不必先发送字符串长度,因为接收方可以先调用消息,然后分配适当大小的缓冲区:

// Sender

string bla = "blabla";
MPI::COMM_WORLD.Send(bla.c_str(), bla.length(), MPI::CHAR, dest, 1);

// Receiver

MPI::Status status;
MPI::COMM_WORLD.Probe(source, 1, status);
int l = status.Get_count(MPI::CHAR);
char *buf = new char[l];
MPI::COMM_WORLD.Recv(buf, l, MPI::CHAR, source, 1, status);
string bla1(buf, l);
delete [] buf;
Run Code Online (Sandbox Code Playgroud)

这里接收器用于Probe探测匹配的消息,并检查status对象以找出消息中有多少字符.然后它分配一个相同大小的缓冲区,接收消息并从中构造一个std::string对象.