在Fortran中,将Array或Array(:)传递给函数有什么区别?

时间:2014-04-04 15:04:18

标签: arrays fortran mpi subset

正如标题所说,我对数组本身和数组子集之间的类型差异感兴趣。对于背景,我将数组传递给MPI函数,该函数触发超出界限的数组索引。使用零长度数组调用时出错,但仅使用子集表示法。以下是手头问题的简化示例:

real(4), allocatable :: myData(:)

allocate(myData(numElements), STAT=iStat)

! The following calls only differ in the second argument
! Passing array itself always works (e.g. myData)
call MPI_FILE_WRITE_ALL(file, myData, MPI_REAL4, numElements, &
                        MPI_STATUS_IGNORE, mpiErr)

! Passing converted subset always works (e.g. real(myData(:), 4)
call MPI_FILE_WRITE_ALL(file, real(myData(:), 4), MPI_REAL4, numElements, &
                        MPI_STATUS_IGNORE, mpiErr)

! Passing subset works unless numElements is zero
call MPI_FILE_WRITE_ALL(file, myData(:), MPI_REAL4, numElements, &
                        MPI_STATUS_IGNORE, mpiErr)

以下是documentation for MPI_FILE_WRITE_ALL的链接,但似乎只需要BUFFER(*)。关于为什么这些不同的调用表现得如此不同的任何想法?

1 个答案:

答案 0 :(得分:0)

回答关于标题的问题:

当传递数组切片时,必须创建临时数组并且必须将数据复制到其中,当传递整个数组时,这不是必需的,并且使用对原始数组的引用而不是复制。

如M. S. B.提供的链接中所述,在评论中,传递切片也会导致数组边界信息丢失。