我的程序正在编译并显示异常行为。
使用以下命令进行编译
mpicc one.c -o one
mpiexec -n 2 ./一个
我尝试调试它,但未显示任何编译错误。 我不明白为什么我的程序行为异常
#include<mpi.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char * argv[])
{
char str[434];
int n;
int rank,size; MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(rank == 0)
{//Sender process
scanf("%s",&str);
MPI_Ssend(&n,1,MPI_INT,1,0,MPI_COMM_WORLD);
MPI_Ssend(&str,n,MPI_CHAR,1,0,MPI_COMM_WORLD);
printf("Sending word %s in process 0\n",str);
}
else
{//Receiver process
MPI_Recv(&n,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
MPI_Recv(&str,n,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);
printf("Receiving word %s in process 1\n",str);
}
MPI_Finalize();
return 0;
}
输入:
哈哈
实际结果
在进程0中发送单词haha
在过程1中收到单词haha
交换结果
在进程0中发送单词haha
在过程1中接收单词��������
答案 0 :(得分:0)
正如人们在对您的帖子的评论中所指出的那样,您不能像以前那样使用str
,因为scanf()
在传递char *
时会期望char (*)[434]
"-Werror -Wformat"
,不一样。
如果使用#include<mpi/mpi.h>
#include<stdio.h>
#include<string.h>
#include <malloc.h>
int main(int argc, char * argv[])
{
const int size = 434;
char* str_send = (char*) malloc(size * sizeof(char)); // = "haha";
char* str_recv = (char*) malloc(size * sizeof(char));
int n = size;
int rank;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(rank == 0)
{//Sender process
scanf("%s", str_send);
MPI_Ssend(&n,1,MPI_INT,1,0,MPI_COMM_WORLD);
MPI_Ssend(str_send,n,MPI_CHAR,1,0,MPI_COMM_WORLD);
printf("Sending word %s in process 0\n",str_send);
}
else
{//Receiver process
MPI_Recv(&n,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
MPI_Recv(str_recv,n,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);
printf("Receiving word %s in process 1\n",str_recv);
}
MPI_Finalize();
return 0;
}
标志进行编译,则会看到此错误(或警告)。
修改代码以使用指针而不是char数组后,其外观如下:
scanf
哪个给出输出:
junglefox @ ubuntu:〜/ test_programs $ mpicc main.c
junglefox @ ubuntu:〜/ test_programs $ mpiexec -n 2 ./a.out
哈哈
在进程0中发送单词haha
在过程1中收到单词haha
既然如此,我觉得您想测试 MPI 库,而不是陷入其他麻烦,我建议您使用固定输入并寻找固定输出,而不要使用{{1 }}。例如,
const char* str_send = "haha";
然后删除或注释掉scanf行。
// scanf("%s", str_send);