【问题标题】:Why there is no string in my C mpi program?为什么我的 C mpi 程序中没有字符串?
【发布时间】:2020-02-27 08:43:27
【问题描述】:

我想从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 的长度上,但是如何纠正呢?

【问题讨论】:

  • int len_G = strlen(G_str); 等于 0 因为 G_str 未初始化
  • @Cid 实际上在这种情况下strlen(G_str) 是 UBS,它可以返回任何值,甚至可能使程序崩溃或做其他讨厌的事情
  • char G_str [10]; 未初始化。 char G_str [10]; -> char G_str [10] = "";.
  • @Jabberwocky 我改变了 char G_str [10];到 char G_str [10] = "";但它没有用

标签: c string char mpi strlen


【解决方案1】:
char G_str [10];

G_str 未初始化。您只需使用该语句声明 char 数组 G_str,但不要初始化字符串。

因此做:

int len_G = strlen(G_str);

您将获得Undefined Behavior,因为strlen 搜索以NUL 结尾的字符串的\0 字符,而G_str 中显然不存在该字符。


变化:

char G_str [10];

至少:

char G_str [10] = "";

或者:

char G_str[10];
G_str[0] = 0;

初始化一个空字符串。

如果您想在len_G 中获得G_str 数组的长度,则不应使用strlen,因为它只计算字符,直到找到字符串的终止\0 字符,留下@987654337 @ 和数组的其余部分(如果在 \0 之后还有更多 char 元素)计数。相反,您应该使用 sizeof 运算符:

int len_G = sizeof(G_str);

获取整个数组的容量G_str。

【讨论】:

  • 我改变了 char G_str [10];到 char G_str [10] = "";但它没有用
  • @KongL37 试试看:int len_G = sizeof(G_str);
猜你喜欢
  • 2020-03-15
  • 2015-01-13
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 2021-02-23
相关资源
最近更新 更多