Как люди любезно указали в комментариях к вашему сообщению, вы не можете использовать str
таким, каким вы были, потому что scanf()
ожидает char *
, а вы передаете его char (*)[434]
, которые не то же самое.
Вы бы увидели эту ошибку (или предупреждение), если бы вы скомпилировали с флагами "-Werror -Wformat"
.
После изменения кода для использования указателя, а не массива char, он выглядит следующим образом:
#include<mpi/mpi.h>
#include<stdio.h>
#include<string.h>
#include <malloc.h>
int main(int argc, char * argv[])
{
const int size = 434;
char* str_send = (char*) malloc(size * sizeof(char)); // = "haha";
char* str_recv = (char*) malloc(size * sizeof(char));
int n = size;
int rank;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(rank == 0)
{//Sender process
scanf("%s", str_send);
MPI_Ssend(&n,1,MPI_INT,1,0,MPI_COMM_WORLD);
MPI_Ssend(str_send,n,MPI_CHAR,1,0,MPI_COMM_WORLD);
printf("Sending word %s in process 0\n",str_send);
}
else
{//Receiver process
MPI_Recv(&n,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
MPI_Recv(str_recv,n,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);
printf("Receiving word %s in process 1\n",str_recv);
}
MPI_Finalize();
return 0;
}
Что дает вывод:
junglefox @ ubuntu: ~ / test_programs $ mpicc main.c
junglefox @ ubuntu: ~ / test_programs $ mpiexec -n 2 ./a.out
ха-ха
Отправка слова хаха в процессе 0
Получение слова хаха в процессе 1
Поскольку я считаю, что вы хотите протестировать библиотеку MPI и не увязнуть в других тонкостях, я бы предложил использовать фиксированный ввод и искать фиксированный вывод вместо использования scanf
. Например,
const char* str_send = "haha";
А затем удалите или закомментируйте строку scanf.
// scanf("%s", str_send);