为什么我的 C mpi 程序中没有字符串?
Why there is no string in my C mpi program?
我想从0进程向1-6进程发送消息(greeting),每次消息后面都加上数字i(G_str),但是结果显示
processor 1 received string: from processor 0
processor 2 received string: from processor 0
...
我不知道它没有显示我要发送的消息
#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int PID, P;
char greeting [] = "hello";
char replying [] ="nice to see you";
char G_str [10];
char R_str [10];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &P);
MPI_Comm_rank(MPI_COMM_WORLD, &PID);
int len_g = strlen(greeting);
int len_r = strlen(replying);
int len_G = strlen(G_str);
//send and receive//
if (PID == 0){
for (int i = 1; i <= 6; i++)
{
sprintf(G_str, "%s%d", greeting,i);
MPI_Send(&G_str, len_G, MPI_CHAR, i, 77, MPI_COMM_WORLD);
}
}
else{
MPI_Recv(&G_str, len_G, MPI_CHAR, 0, 77, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("processor %d received string %s from processor 0 \n", PID, G_str);
}
MPI_Finalize();
}
我猜问题出在 G_str 的长度上,但如何更正它?
char G_str [10];
G_str
未初始化。您只需使用该语句声明 char
数组 G_str
,但不要初始化字符串。
因此做:
int len_G = strlen(G_str);
你会得到 Undefined Behavior,因为 strlen
搜索以 NUL 结尾的字符串的 [=20=]
字符,这显然在 G_str
中不存在。
变化:
char G_str [10];
至少:
char G_str [10] = "";
或者:
char G_str[10];
G_str[0] = 0;
初始化一个空字符串。
如果你想在 len_G
中得到 G_str
数组的长度,你不应该使用 strlen
因为它只计算字符直到找到终止 [=20= ]
字符串的字符,将 [=20=]
和数组的其余部分(如果在 [=20=]
之后还有 char
元素保留)不计入计数。相反,您应该使用 sizeof
运算符:
int len_G = sizeof(G_str);
获取整个数组的容量G_str
。
我想从0进程向1-6进程发送消息(greeting),每次消息后面都加上数字i(G_str),但是结果显示
processor 1 received string: from processor 0
processor 2 received string: from processor 0
...
我不知道它没有显示我要发送的消息
#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int PID, P;
char greeting [] = "hello";
char replying [] ="nice to see you";
char G_str [10];
char R_str [10];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &P);
MPI_Comm_rank(MPI_COMM_WORLD, &PID);
int len_g = strlen(greeting);
int len_r = strlen(replying);
int len_G = strlen(G_str);
//send and receive//
if (PID == 0){
for (int i = 1; i <= 6; i++)
{
sprintf(G_str, "%s%d", greeting,i);
MPI_Send(&G_str, len_G, MPI_CHAR, i, 77, MPI_COMM_WORLD);
}
}
else{
MPI_Recv(&G_str, len_G, MPI_CHAR, 0, 77, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("processor %d received string %s from processor 0 \n", PID, G_str);
}
MPI_Finalize();
}
我猜问题出在 G_str 的长度上,但如何更正它?
char G_str [10];
G_str
未初始化。您只需使用该语句声明 char
数组 G_str
,但不要初始化字符串。
因此做:
int len_G = strlen(G_str);
你会得到 Undefined Behavior,因为 strlen
搜索以 NUL 结尾的字符串的 [=20=]
字符,这显然在 G_str
中不存在。
变化:
char G_str [10];
至少:
char G_str [10] = "";
或者:
char G_str[10];
G_str[0] = 0;
初始化一个空字符串。
如果你想在 len_G
中得到 G_str
数组的长度,你不应该使用 strlen
因为它只计算字符直到找到终止 [=20= ]
字符串的字符,将 [=20=]
和数组的其余部分(如果在 [=20=]
之后还有 char
元素保留)不计入计数。相反,您应该使用 sizeof
运算符:
int len_G = sizeof(G_str);
获取整个数组的容量G_str
。