C 未声明的MPI数组

C 未声明的MPI数组,c,parallel-processing,mpi,hpc,C,Parallel Processing,Mpi,Hpc,我附加了一个最小的复制错误的例子,我在一个大的代码面临。假设我有两个进程,P0和P1。我在P0中声明一个数组int-arr[2],并在arr[0]中存储一个值。然后,我仅为P1重新定义int-arr[2],但每当我试图在P1内部访问它时,我会得到'arr'未声明(首次在此函数中使用)37 | arr[1]=1错误。我在这里附上代码 #include <string.h> #include <stdio.h> #include <stdlib.h> #inclu

我附加了一个最小的复制错误的例子,我在一个大的代码面临。假设我有两个进程,P0和P1。我在P0中声明一个数组
int-arr[2]
,并在
arr[0]
中存储一个值。然后,我仅为P1重新定义
int-arr[2]
,但每当我试图在P1内部访问它时,我会得到
'arr'未声明(首次在此函数中使用)37 | arr[1]=1错误。我在这里附上代码

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

int main( int argc, char *argv[])
{

     MPI_Init(&argc, &argv);
     int myrank, size; //size will take care of number of processes  
     double sTime, eTime, time,max_time;
     
     MPI_Comm_rank(MPI_COMM_WORLD, &myrank) ;
     MPI_Comm_size(MPI_COMM_WORLD, &size);
    
     int r=0, c;  
      
     if(myrank==0)
     {
        int arr[2];
        arr[0]=1;
     }

     if(myrank!=0)
     {
        int arr[2]; 
     }

     if(myrank==1)
     {
       arr[1]=2;
       MPI_Send(&arr[1], 1 , MPI_INT, 0 /*dest*/ , 100 /*tag*/ , MPI_COMM_WORLD);
    
     }

     MPI_Status status[2];

     if(myrank==0)
     {
        MPI_Recv(&arr[1],1 , MPI_INT, 1 /*src*/ , 100 /*tag*/, MPI_COMM_WORLD,&status[1]);
    
        for(int i=0;i<2;i++)
        {
           printf(" %d",arr[i]);
        }
   }
   MPI_Finalize();
   return 0;
}


但这次我犯了这个错误

未声明的“arr”(首次在此函数中使用) 47 | MPI_Recv(arr[0],1,MPI_INT,1/src/,100/tag/,MPI_COMM_WORLD和status[1])


我不知道这里出了什么问题。任何建议都会非常有用。

该错误是因为您在if语句中声明了一个变量,并且希望在if语句之外使用该变量。在C语言中,当您执行以下操作时,这是不可能的:

if(myrank==0)
{
    int arr[2];
    arr[0]=1;
}
数组
int-arr[2]将仅存在于该if语句的范围内。因此,如果试图在外部访问它,将导致编译错误

要绕过此问题,您可以在
if
语句外部声明
int-arr[2]
(但随后将分配所有MPI进程),或者在外部声明指向
int
的指针,并仅为所需进程的该指针分配内存,即:

int *arr = NULL;
if(myrank==0)
{
    arr = malloc(sizeof(int) * 2);
    arr[0]=1;
}
当不再需要阵列时,不要忘记释放它:

free(arr);
另一个选项(在您的示例中有效)是重新排列代码,以便将与一个进程相关的所有代码放在一个
if
分支中,并将来自另一个
if
分支的另一个进程的代码放在另一个
分支中,即:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

int main( int argc, char *argv[])
{
     MPI_Init(&argc, &argv);   
     int myrank, size; //size will take care of number of processes 
     double sTime, eTime, time,max_time;
     MPI_Status status[2];
     MPI_Comm_rank(MPI_COMM_WORLD, &myrank) ;
     MPI_Comm_size(MPI_COMM_WORLD, &size);
   
    int r=0, c;  
      
    if(myrank==0)
    {
       int arr[2];
       arr[0]=1;
       MPI_Recv(&arr[1],1 , MPI_INT, 1 /*src*/ , 100 /*tag*/, MPI_COMM_WORLD,&status[1]);
    
       for(int i=0;i<2;i++)
         printf(" %d",arr[i]);
    }
    if(myrank==1)
    {
       int arr[2];    
       arr[1]=2;
       MPI_Send(&arr[1], 1 , MPI_INT, 0 /*dest*/ , 100 /*tag*/ , MPI_COMM_WORLD);
    }
    
    MPI_Finalize();
    return 0;
}
#包括
#包括
#包括
#包括“mpi.h”
int main(int argc,char*argv[])
{
MPI_Init(&argc,&argv);
int myrank,size;//size将考虑进程的数量
双倍时间、时间、时间、最大时间;
MPI_状态[2];
MPI_Comm_rank(MPI_Comm_WORLD和myrank);
MPI_通信大小(MPI_通信世界和大小);
int r=0,c;
如果(myrank==0)
{
int-arr[2];
arr[0]=1;
MPI_Recv(&arr[1],1,MPI_INT,1/*src*/,100/*tag*/,MPI_COMM_WORLD,&status[1]);
对于(int i=0;i
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

int main( int argc, char *argv[])
{
     MPI_Init(&argc, &argv);   
     int myrank, size; //size will take care of number of processes 
     double sTime, eTime, time,max_time;
     MPI_Status status[2];
     MPI_Comm_rank(MPI_COMM_WORLD, &myrank) ;
     MPI_Comm_size(MPI_COMM_WORLD, &size);
   
    int r=0, c;  
      
    if(myrank==0)
    {
       int arr[2];
       arr[0]=1;
       MPI_Recv(&arr[1],1 , MPI_INT, 1 /*src*/ , 100 /*tag*/, MPI_COMM_WORLD,&status[1]);
    
       for(int i=0;i<2;i++)
         printf(" %d",arr[i]);
    }
    if(myrank==1)
    {
       int arr[2];    
       arr[1]=2;
       MPI_Send(&arr[1], 1 , MPI_INT, 0 /*dest*/ , 100 /*tag*/ , MPI_COMM_WORLD);
    }
    
    MPI_Finalize();
    return 0;
}