Почему в моей программе C mpi нет строки? - PullRequest
1 голос
/ 27 февраля 2020

Я хочу отправить сообщение (приветствие) от 0 процесса до 1-6 процесса и добавлять число 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, но как ее исправить?

1 Ответ

2 голосов
/ 27 февраля 2020
char G_str [10];

G_str не инициализируется. Вы просто объявляете массив char G_str с этим оператором, но не инициализируете строку.

Поэтому, выполнив:

int len_G = strlen(G_str);

, вы получите Неопределенное поведение , так как strlen ищет \0 символ строки, заканчивающейся NUL, которая явно не существует в G_str.


Изменение:

char G_str [10];
* От 1020 * по крайней мере:
char G_str [10] = "";

или вместо:

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

для инициализации пустой строки.

Если вы хотите иметь длину массива G_str в len_G вы не должны использовать strlen, так как он считает только символы, пока не найдет завершающий символ \0 строки, оставляя \0 и остальную часть массива (если дополнительные элементы char после того, как \0 останется). Вместо этого вы должны использовать оператор sizeof:

int len_G = sizeof(G_str);

, чтобы получить емкость введенного массива G_str.

...