全部博文(36)
分类: C/C++
2012-03-22 14:17:02
在学习都老师的书里的一个小程序时,遇到了一个问题,本来以为是很容易的问题,却费了很多周折。
例子是这样的:
#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-/MTd,Release-/MT)的问题。
一直搞不明白这个是怎么个设置方法,网上查了很多,没有一个能说明白的,找了很久终于找到一条有用的:
其实是这样的,
最后发现,换了MPICH版本还是不管用,问题依旧。
经过仔细思考,终于发现问题所在,发送的长度是“strlen(msg)”,并不包括字符串的结尾“\0”字符,所以接收进程收到的消息是不完整的,因此怎么输出都不对。因此只要将发送消息的长度加一,即“strlen(msg)+1”。
编译运行,即恢复正常。