2013-03-31 35 views
6

我試圖從每個處理器創建一個日誌文件,然後將它作爲字符數組發送到根。我先發送長度然後發送數據。長度發送很好,但數據總是垃圾!這裏是我的代碼:嘗試MPI_Send和MPI_Recv字符數組變得垃圾

MPI_Barrier (MPI_COMM_WORLD); 
string out = ""; 

MPI_Status status[2]; 
MPI_Request reqs[num_procs]; 

string log = "TEST"; 
int length = log.length(); 
char* temp = (char *) malloc(length+1); 
strcpy(temp, log.c_str()); 

if (my_id != 0) 
{ 
    MPI_Send (&length, 1, MPI_INT, 0, 1, MPI_COMM_WORLD); 
    MPI_Send (&temp, length+1, MPI_CHAR, 0, 1, MPI_COMM_WORLD); 
} 
else {  
    int length; 
    for (int i = 1; i < num_procs; i++) 
    { 
     MPI_Recv (&length, 2, MPI_INT, i, 1, MPI_COMM_WORLD, &status[0]); 
     char* rec_buf; 
     rec_buf = (char *) malloc(length+1); 
     MPI_Recv (rec_buf, length+1, MPI_CHAR, i, 1, MPI_COMM_WORLD, &status[1]); 
     out += rec_buf; 
     free(rec_buf); 
    } 
} 

MPI_Barrier (MPI_COMM_WORLD); 
free(temp); 
+3

您可以添加一個答案。你只需要等待一定的時間。如果你現在回去添加你的答案,它不會顯示爲沒有答案,你可以將它標記爲自己回答(在另一個等待期之後)。 –

+0

是的請在下面添加你的答案 –

+0

爲什麼你用'MPI_Send(&length,1,...)'發送一個單詞,但接收兩個單詞'MPI_Recv(&length,2,...)'? –

回答

3

你傳遞一個char**MPI_Send代替char*這會導致內存損壞,或在你的情況,你所得到的是亂碼輸出。如果你使用

MPI_Send (temp, length+1, MPI_CHAR, 0, 1, MPI_COMM_WORLD); 

一切都應該罰款(注意去掉&在第一個參數前,temp。)