接收字符串时出现截断错误

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_Recvcount 参数作为 strlen(inputList)+1 传递,但 inputList 从未被初始化。您可能需要 sizeof(inputList) 这里。