接收字符串时出现截断错误
Truncation error when receiving a string
好的,所以这里游戏的目的是让 64 个处理器(代表一个 8x8 网格)中的每一个生成一个随机数(介于 0 和 1 之间),并为进程 0 提供一个代表完整情况的字符串。例如网格:
[0,1,0,1]
[1,1,1,1]
[0,0,0,0]
4x3 最终会得到字符串“0101111000”。
每个进程只能与上面和左边的进程通信。
为此,我让每个进程在其右侧接收一个包含所有数字的字符串(如果它不在最右侧),将其数字添加到字符串的前面并将其发送到左侧。
如果进程在最左边,它也从它下面的进程(不包括左下角,等级56)接收一个字符串,描述该等级以下的所有节点的状态。它加入自己的值,左弦和下弦,向上发送。
所有最左边的节点都以其行的字符串开始。
我尝试的代码如下:
#include <stdio.h>
#include "mpi.h"
#include <string.h>
#include <stdlib.h>
int farLeft(int rank){// edit
if (rank%8==0){
return 1;
}
return 0;
}
int farRight(int rank){// edit
if (rank%8==7){
return 1;
}
return 0;
}
int main(argc, argv)
int argc;
char **argv;
{
char inputList[100],myWhisp[100],snum[256];
int rank,value;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
srand(rank);
value = rand() % 2;
sprintf(snum, "%d", value);
strcpy(myWhisp,snum);
if (farLeft(rank)){
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+1, 0, MPI_COMM_WORLD, &status);
strcat(snum,inputList);
strcpy(myWhisp,snum);
if (rank !=56){
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+8, 0, MPI_COMM_WORLD, &status);//rank48 crashes here
strcat(myWhisp,inputList);
}
strcpy(inputList,myWhisp);
if(rank==0){
printf("%s\n",inputList);
}
else{
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-8, 0, MPI_COMM_WORLD);
}
}
else if (farRight(rank)){
strcpy(inputList,myWhisp);
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-1, 0, MPI_COMM_WORLD);
}
else{
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+1, 0, MPI_COMM_WORLD, &status);
strcat(snum,inputList);
strcpy(inputList,snum);
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-1, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
我遇到了第 48 位的截断错误,最左边的倒数第二位。这发生在下面的接收函数上 if(rank != 56)。所以我猜我发送/接收 inputString 的方式有问题......
非常感谢。
您将 MPI_Recv
的 count
参数作为 strlen(inputList)+1
传递,但 inputList
从未被初始化。您可能需要 sizeof(inputList)
这里。
好的,所以这里游戏的目的是让 64 个处理器(代表一个 8x8 网格)中的每一个生成一个随机数(介于 0 和 1 之间),并为进程 0 提供一个代表完整情况的字符串。例如网格:
[0,1,0,1]
[1,1,1,1]
[0,0,0,0]
4x3 最终会得到字符串“0101111000”。
每个进程只能与上面和左边的进程通信。
为此,我让每个进程在其右侧接收一个包含所有数字的字符串(如果它不在最右侧),将其数字添加到字符串的前面并将其发送到左侧。
如果进程在最左边,它也从它下面的进程(不包括左下角,等级56)接收一个字符串,描述该等级以下的所有节点的状态。它加入自己的值,左弦和下弦,向上发送。
所有最左边的节点都以其行的字符串开始。
我尝试的代码如下:
#include <stdio.h>
#include "mpi.h"
#include <string.h>
#include <stdlib.h>
int farLeft(int rank){// edit
if (rank%8==0){
return 1;
}
return 0;
}
int farRight(int rank){// edit
if (rank%8==7){
return 1;
}
return 0;
}
int main(argc, argv)
int argc;
char **argv;
{
char inputList[100],myWhisp[100],snum[256];
int rank,value;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
srand(rank);
value = rand() % 2;
sprintf(snum, "%d", value);
strcpy(myWhisp,snum);
if (farLeft(rank)){
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+1, 0, MPI_COMM_WORLD, &status);
strcat(snum,inputList);
strcpy(myWhisp,snum);
if (rank !=56){
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+8, 0, MPI_COMM_WORLD, &status);//rank48 crashes here
strcat(myWhisp,inputList);
}
strcpy(inputList,myWhisp);
if(rank==0){
printf("%s\n",inputList);
}
else{
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-8, 0, MPI_COMM_WORLD);
}
}
else if (farRight(rank)){
strcpy(inputList,myWhisp);
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-1, 0, MPI_COMM_WORLD);
}
else{
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+1, 0, MPI_COMM_WORLD, &status);
strcat(snum,inputList);
strcpy(inputList,snum);
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-1, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
我遇到了第 48 位的截断错误,最左边的倒数第二位。这发生在下面的接收函数上 if(rank != 56)。所以我猜我发送/接收 inputString 的方式有问题......
非常感谢。
您将 MPI_Recv
的 count
参数作为 strlen(inputList)+1
传递,但 inputList
从未被初始化。您可能需要 sizeof(inputList)
这里。