Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167387
  • 博文数量: 36
  • 博客积分: 648
  • 博客等级: 上士
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-09 15:29
文章分类

全部博文(36)

文章存档

2013年(2)

2012年(26)

2011年(8)

我的朋友

分类: C/C++

2012-03-22 14:17:02

MPI发送接收消息乱码的问题

在学习都老师的书里的一个小程序时,遇到了一个问题,本来以为是很容易的问题,却费了很多周折。

例子是这样的:

#include "mpi.h"

main( argc, argv )

int argc;

char **argv;

{

char  message[20];

int myrank;

MPI_Init(  &argc,  &argv  );

/* MPI程序的初始化*/

MPI_Comm_rank(  MPI_COMM_WORLD,  &myrank  );

/*得到当前进程的标识*/

if  (myrank  ==  0)  /*  若是  0  进程*/

{

strcpy(message,"Hello,  process 1");

MPI_Send(message,  strlen(message), MPI_CHAR, 1, 99,MPI_COMM_WORLD);

}

else if(myrank==1) /*  若是进程  1 */

{

MPI_Recv(message,  20,  MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);

printf("received  :%s:",  message);

}

MPI_Finalize();

/* MPI程序结束*/

}

拷贝到VC里,编译运行,该加的头文件手动加上,该定义的变量定义好。运行之后,会发现出现如下乱码问题:

反正书里是这么写的,我搜了很久,也没搞明白问题,在哪里。开始我以为是MPICH新版本的问题,于是我又换上了MPICH1.2.4的版本,旧版本的设置和新版本是不一样的,参考说明文档就行了,但是有一点,设置开关选项(Debug-/MTdRelease-/MT)的问题。

一直搞不明白这个是怎么个设置方法,网上查了很多,没有一个能说明白的,找了很久终于找到一条有用的:

其实是这样的,

最后发现,换了MPICH版本还是不管用,问题依旧。

经过仔细思考,终于发现问题所在,发送的长度是“strlen(msg)”,并不包括字符串的结尾“\0”字符,所以接收进程收到的消息是不完整的,因此怎么输出都不对。因此只要将发送消息的长度加一,即strlen(msg)+1

    编译运行,即恢复正常。

   

阅读(1945) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~