错误:函数内部未声明变量

时间:2018-07-24 12:13:41

标签: c

问题是main()内部声明的MPI结构在函数内部不可见。编译器给出以下错误:

my_prog.c: In function ‘void get(int)’:
my_prog.c:585:21: error: ‘MPI_GETSET’ was not declared in this scope
MPI_Send(&msg, 1, MPI_GETSET, rank, 0, MPI_COMM_WORLD);

代码段为:

struct mpi_send{
  int job;
  int z;
  int img;
  short grp;
  short stp;
};

mpi_send msg;

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);
...
    MPI_Datatype MPI_GETSET;
    MPI_Datatype type[5] = {MPI_INT,MPI_INT,MPI_INT,MPI_SHORT,MPI_SHORT};
    int blocklen[5] = {1,1,1,1,1};
    MPI_Aint disp[5];
    disp[0]=sizeof(int); disp[1]=sizeof(int); disp[2]=sizeof(int);
    disp[3]=sizeof(short); disp[4]=sizeof(short);
    MPI_Type_create_struct(5, blocklen, disp, type, &MPI_GETSET);
    MPI_Type_commit(&MPI_GETSET);
...
    get(13);
}

void get(int z){
...
    MPI_Send(&msg, 1, MPI_GETSET, rank, 0, MPI_COMM_WORLD);
    MPI_Recv(&msg, 1, MPI_GETSET, rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
...
}

我希望能弄清为什么不能在函数内部使用MPI_GETSET。 预先感谢。

1 个答案:

答案 0 :(得分:1)

MPI_GETSET的范围是main()子例程。

直接的后果是未在get()子例程中定义此变量。

基本上,您有两个选择可以继续前进:

  • MPI_GETSET作为get()子例程的参数
  • MPI_GETSET声明为全局变量

如果您的编译器足够新(请注意,您可能需要一些额外的标志),则第三个选择是在get()子例程的内部中声明main()子例程。 (请随时参考Nested function in C