我想通过MPI发送一个字符串变量,但我不知道该怎么做!我的代码在这里:
static string fourTupX="Hello";
现在我想通过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 );
并在另一侧接收:
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 );
但收到后没有任何东西在fourTupx!有什么问题吗?
4条答案
按热度按时间qvtsj1bj1#
您必须发送从
c_str()
获得的字符串缓冲区的内容。您不必首先发送字符串长度,因为接收方可以简单地首先探测消息,然后分配适当大小的缓冲区:在这里,接收方使用
Probe
来探测匹配的消息,并检查status
对象以找出消息中有多少个字符。然后,它分配一个相同大小的缓冲区,接收消息并从中构造一个std::string
对象。af7jpaap2#
据我所知,您将从
string
对象的开头发送1个字符,即1个字节。你得把所有东西都寄过来。当发送对象时,您需要小心对象内部的指针,您可能发送的是指针地址,但不是内容本身。如果
string
对象在堆中存储实际的char数组,则可能会出现这种情况。在这种情况下,我宁愿发送
c_str()
而不是对象本身,大小将是c_str()
的长度加上1,以在末尾包含空字符。然后,您可以在接收到string
对象后,从字符数组中重建该对象。EDIT修改字符串发送:
那应该能用
klh5stk13#
我知道这是一个很老的问题,但我想分享我的经验,以防其他人碰到这个问题。
看来赫里斯托的回答已经过时了。为了使它在MPI的较新版本上工作,我建议您使用
abithluo4#
@sondrelv的答案是正确的,但它抛出了“ISO C++禁止可变大小数组”的警告。此代码修复了
new
ing和delete
ing缓冲区的警告。