问题是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。 预先感谢。
答案 0 :(得分:1)
MPI_GETSET
的范围是main()
子例程。
直接的后果是未在get()
子例程中定义此变量。
基本上,您有两个选择可以继续前进:
MPI_GETSET
作为get()
子例程的参数
MPI_GETSET
声明为全局变量 如果您的编译器足够新(请注意,您可能需要一些额外的标志),则第三个选择是在get()
子例程的内部中声明main()
子例程。
(请随时参考Nested function in C)