我正在设计一个与 hdf5 Fortran 库一起使用的模块。该模块包含从文件读取和写入不同类型和形状的数组的子程序。
例如,无论数组的形状和类型如何,我都希望能够调用 writeToHDF5(filepath, array)。我意识到必须使用接口来使用不同的类型来实现这一点。然而,我想知道是否有可能假设数组的形状。
例如
如果定义了一个数组,例如
integer(kind=4), dimension(*),intent(in) :: array
Run Code Online (Sandbox Code Playgroud)
并传递了一个二维数组,这将起作用。有没有办法在不为数组的每个形状创建单独的子例程的情况下做到这一点?
正如弗拉基米尔˚F说,Fortran的2015年增加了“假定秩” -这是很有用Fortran语言,Fortran语言(它的要求MPI的Fortran语言绑定),但是当你收到这样的阵列,你不能用它做很多的情况下直接额外的并发症。一些编译器已经支持这一点,但很少(如果有的话?)支持新添加的 SELECT RANK 结构,这使得它更有用。
但是,您可以使用 C_LOC 和 C_F_POINTER 将假定等级的虚拟变量“转换”为指向您喜欢的任何等级的数组的指针,因此这是一种可能性。
标准(甚至回到 Fortran 90)确实给了你一个在这里。如果你写:(call writeToHDF5(filepath, array(1,1))这里假设数组是 rank 2),被调用过程的显式接口可以通过“序列关联”的魔力为虚拟参数指定任何等级。但是有一些限制 - 特别是数组不允许是假定形状或指针。